【问题标题】:Passing environment variables to `subprocess.call`将环境变量传递给`subprocess.call`
【发布时间】:2018-08-19 03:56:18
【问题描述】:

我有一个 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 之前,我可以看到项目目录的完整内容。

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

【问题讨论】:

标签: python subprocess environment-variables


【解决方案1】:

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

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

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

【讨论】:

  • cd 不是可执行文件(怎么可能?),它是一个内置的 shell。
  • 很好,是的,我认为 shell=True 会这样做。我觉得我过去也经历过那个发现。很高兴听到它对你有用!
猜你喜欢
  • 2013-12-29
  • 2021-09-05
  • 2020-03-27
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2017-03-06
相关资源
最近更新 更多