我有一个包含my_script.sh
之类的行的bash脚本./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
无法更改目录,但是当我手动运行脚本时能够这样做?我真的很茫然。提前感谢任何见解。
答案 0 :(得分:1)
问题原来是subprocess.call
在我写的时候调用时找不到cd
,因此无法使用cwd
选项。预先
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
到我的crontab,或者使用标记subprocess.call
调用shell=True
,将cd
纳入范围并修复了问题。