【发布时间】:2018-04-06 13:21:32
【问题描述】:
我有一个 python 脚本 main.py 需要启动 scrapy 可执行文件,所以我使用 Popen 来执行此操作(使用 subprocess.call() 具有相同的结果)。为了简化事情,我只运行了 scrapy 的帮助参数。
import subprocess
...
p = subprocess.Popen(['scrapy', '-h'])
脚本需要在安装了 scrapy 的 vitualenv 中运行。当我激活 virtualenv 并以python main.py 运行脚本时,命令scrapy -h 将按预期执行。
现在,我需要将此脚本作为 systemd 服务运行。我为脚本创建了 systemd 单元,如下所示:
[Unit]
Description=Scrapy test
After=network.target
[Service]
User={{ scrapy_user }}
WorkingDirectory={{ test_path }}
ExecStart={{ virtualenv_path }}/bin/python {{ test_path }}/main.py
[Install]
WantedBy=multi-user.target
当我使用sudo systemctl start scrapy-test 启用并启动服务时,代码正常运行,直到p = subprocess.Popen(['scrapy', '-h']) 引发异常
File "{{ test_path }}/main.py", line 52, in launch_spider
p = subprocess.Popen(['scrapy', '-h'])
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我还尝试通过在Popen 之前添加os.chdir('{{ virtualenv_path }}/bin') 来更改工作目录,但我得到了完全相同的异常。我确信脚本是通过 virtualenv 运行的,因为 (1) 它是在 ExecStart 属性中设置的,并且 (2) 在导入系统 python 中未安装的模块时,脚本会更早引发异常。
【问题讨论】:
-
我有同样的问题,但在我的情况下,您的解决方案不起作用,因为它是调用 hcitool 或 gatttool 的第三方库 (pygatt)。
-
您能否将您的答案从问题中的编辑移到适当的、可接受的回复中?
标签: python scrapy virtualenv popen systemd