我已经阅读了多篇文章和许多文章,详细介绍了cron作业中的脚本需要保留由于cron中shell的打开而在脚本本身内部运行所需的环境变量。我的情况是独特的,因为我的路径变量都是按照所讨论的那样设置的,这反过来将使用subprocess.call ()成功调用pysaunter python egg ,但是它似乎从那里分解了。这导致整个过程中断了cron作业。
为了清楚起见,以下是我引用的步骤:
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的目录。pysaunter -m foo -v从交互式shell调用该命令时,该命令正常工作。
pysaunter -m foo -v
我在pysaunter上找不到太多帮助,因此我认为这里不需要过多的pysaunter细节。但是,如果您了解有关pysaunter的更多信息,请告诉我是否需要更多信息。我不确定分享什么。
我还阅读了许多文章,讨论了通过编辑.profile / .bash_profile来更改Shell默认行为的功能。我试图找到一个位置,使我的路径变量可以全局访问,但是我什么也找不到。我不确定如何完成此操作,这可能会解决我的问题,因此,如果您对此有所了解,请告诉我。
最后说明,它在Mac 10.7.5上运行。
经过大量的试验和错误,并且在网上获得了许多很多stackoverflow.com文章和其他教程,并且在Perl脚本的帮助下,我发现它执行了类似的操作,因此我能够弄清楚要使此方法起作用需要做些什么。 。
以下是确保正确设置所有步骤的步骤:
确保在.profile或.bash_profile中的PYTHONPATH此处,以及更多信息。请在此处)中具有所需的变量,以用于要在其中测试脚本的任何shell,以确保其有效。
编辑您的crontab,以在cron作业中包含运行脚本所需的目录
一)一定要包括在PATH变量(。)作为解释的根目录在这里。基本上,如果您使用命令运行可执行文件,则它必须能够找到存储可执行文件的根目录或目录,以及以下可能的目录:(/ sbin:/ bin:/ usr / sbin:/ usr / bin)。
a)如下所示:
* * * * cd /Users/user/Documents/foo; bar -l doSomething -v
第一种方法如下所示:
... #some script calls my_env = os.environ.copy() my_env["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>") os.chdir("<path/to/desired/directory>") subprocess.Popen(<call_as_string>, env=my_env, shell=True)
第二个看起来像这样:
... #some script calls os.environ["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>") os.chdir("<path/to/desired/directory>") subprocess.Popen(<call_as_list_of_arguments)
由于可执行文件所需的路径包含在它被称为从壳佣工目录,这是必要的环境变量传递给可执行文件解释[这里。不过,我发现,在环境中修改PATH变量不适用于cron作业,而设置PYTHONPATH则可以。我在这里读到,shell使用PATH变量仅查找可执行文件,因此对于cronjob中的新shell,您需要将其传递给PYTHONPATH来寻找新的Python模块。(这在Python文档中也有解释。)
问题中引用的子流程文档中说明了两种不同方法之间的差异,但是可以在此处找到有关此模块的很好的教程。