小编典典

Python脚本未在调用pysaunter的crontab中运行

python

我已经阅读了多篇文章和许多文章,详细介绍了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上找不到太多帮助,因此我认为这里不需要过多的pysaunter细节。但是,如果您了解有关pysaunter的更多信息,请告诉我是否需要更多信息。我不确定分享什么。

我还阅读了许多文章,讨论了通过编辑.profile /
.bash_profile来更改Shell默认行为的功能。我试图找到一个位置,使我的路径变量可以全局访问,但是我什么也找不到。我不确定如何完成此操作,这可能会解决我的问题,因此,如果您对此有所了解,请告诉我。

最后说明,它在Mac 10.7.5上运行。


阅读 186

收藏
2021-01-20

共1个答案

小编典典

经过大量的试验和错误,并且在网上获得了许多很多stackoverflow.com文章和其他教程,并且在Perl脚本的帮助下,我发现它执行了类似的操作,因此我能够弄清楚要使此方法起作用需要做些什么。

以下是确保正确设置所有步骤的步骤:

  1. 确保在.profile或.bash_profile中的PYTHONPATH此处,以及更多信息。请在此处)中具有所需的变量,以用于要在其中测试脚本的任何shell,以确保其有效。

  2. 编辑您的crontab,以在cron作业中包含运行脚本所需的目录

一)一定要包括在PATH变量(。)作为解释的根目录在这里。基本上,如果您使用命令运行可执行文件,则它必须能够找到存储可执行文件的根目录或目录,以及以下可能的目录:(/ sbin:/ bin:/
usr / sbin:/ usr / bin)。

  1. 在您的crontab文件中,创建一个cronjob,它将当前目录更改为您之前成功运行脚本的目录(例如/ Users / user / Documents / foo)。

a)如下所示:

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v
  1. 由于我的问题专门针对调用可执行文件,因此有必要注意,有多种编写Python脚本来运行的方法(尽管在发现过程中,我了解到这适用于使用cron中的子进程进行的任何调用)。

第一种方法如下所示:

    ... #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文档中也有解释。)

问题中引用的子流程文档中说明了两种不同方法之间的差异,但是可以在此处找到有关此模块的很好的教程。

2021-01-20