我已閱讀多篇文章和許多文章詳細介紹了在cron作業scipts需要保持必要的環境變量的腳本內部運行,由於cron的內殼的開放。我的情況是獨一無二的,因爲我的路徑變量都是按照討論設置的,而這些變量反過來會使用subprocess.call()成功調用pysaunter python egg,但它似乎從那裏分解了。這導致整個過程在cron作業中被打破。的Python腳本不能在crontab中運行調用pysaunter
爲了清楚起見,這裏是我指的是以下步驟:
1) cronjob calls run_test.py -n foo
2) run_test.py sets the environment variables correctly
(cur_shell_path=sys.path (converted to proper path string, not shown here)
my_env= os.environ.copy()
my_env["PATH"] = my_env["PATH"] + cur_shell_path)
3) run_test.py calls subprocess.call("pysaunter -m foo -v", env=my_env, shell=True)
步驟3的輸出表明,它是找到雞蛋,併成功地開始加載從pysaunter必要的模塊,但隨後它打破時試圖找到一個用於修改pysaunter的目錄。錯誤如下:
ImportError: no module named helpers
我試圖向環境多次添加此路徑,但它似乎從未找到包含helpers.py的目錄。當從交互式shell中調用時,命令pysaunter -m foo -v
正常工作。
我找不到上pysaunter太大的幫助,所以我認爲太多pysaunter細節是不必要在這裏。如果您對pysaunter瞭解更多,請告訴我是否需要更多信息。我不知道要分享什麼。
我也看了很多帖子討論通過編輯.profile文件/ .bash_profile中改變外殼的默認行爲的能力。我試圖找到一個能讓我的路徑變量全局可訪問的地方,但我找不到任何東西。我不確定這是如何完成的,它可能會解決我的問題,所以如果你對此有所瞭解,請告訴我。
最後說明,這是在Mac 10.7.5上運行。
感謝您指出我的問題,我現在已經修正它顯示my_env正在通過。此外,在基於Unix的機器上,冒號(:)用於分隔路徑值,因此不會成爲問題。最後,Pythonpath用於搜索本地目錄,Unix上的本地目錄由shell的啓動位置(http://docs.python.org/release/1.5.1p1/tut/searchPath.html)定義。由於cron作業調用的非交互式shell不是從正確的目錄啓動的,也不會讀取.profile或.bash_profile,因此不會添加任何路徑,因此不會設置Pythonpath。 – derigible
你對結腸是正確的。我修正了這一點。您需要在cron作業中設置PYTHONPATH。您可以創建一個包裝腳本,將PYTHONPATH設置爲所需的目錄,然後調用python腳本。 – korylprince