我有一个bash脚本my_script.sh包含./my_python_script.py 2>&1这样的行,Python脚本中包含以下行

import os
from util import do_something
project_dir = os.environ["PROJECT_DIR"]
do_something(spider_name="my_spider", project_dir=project_dir, data_dir="tmp/")


其中do_something类似于

import subprocess
def do_something(spider_name, project_dir, data_dir):
  subprocess.call(["scrapy", "crawl", spider_name,
    "--set", "FEED_URI=%s%s%s" % (project_dir, data_dir, spider_name+".json"),
  cwd=project_dir+"scrapers/"+spider_name+"/")


我正在像这样的cron作业中调用my_script.sh

0 13 * * * . /home/ubuntu/.profile && cd $HOME/project_dir/ && ./my_script.sh > logs/daily_$CURR_DATE.log 2>&1


我的问题是顶层脚本能够看到传递给它的环境,但是do_something无法以某种方式使用它,从而报告

Traceback (most recent call last):
  File "./my_python_script.py", line 19, in <module>
    project_dir=project_dir, data_dir="tmp/")
  File "/home/ubuntu/project_dir/util/util.py", line 41, in
do_something
    cwd=project_dir+"scrapers/"+spider_name+"/")
  File "/usr/lib/python2.7/subprocess.py", line 523, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory


实际上,包含Scrapy项目的目录确实存在,并且我可以手动运行my_script.sh而不会出现问题。如果我做一个

print os.listdir(project_dir+"scrapers/"+spider_name+"/")


在调用subprocess.call之前,我可以看到项目目录的完整内容。

这里发生了什么?为什么当我从cronjob调用脚本时,subprocess不能更改目录,但是当我手动运行脚本时却可以更改目录?我真的很茫然。预先感谢您的任何见解。

最佳答案

问题出在我写时调用subprocess.call时找不到cd,因此无法使用cwd选项。前置

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin


到我的crontab中,或使用标志subprocess.call调用shell=True,将cd纳入范围并解决了该问题。

09-10 06:33
查看更多