我有一个名为main.py
的Python脚本,需要启动Scrapy可执行文件,因此我使用Popen来执行它(使用subprocess.call()
也会得到相同的结果)。为了简化事情,我只运行了Scrapy的帮助参数。
import subprocess
...
p = subprocess.Popen(['scrapy', '-h'])
脚本需要在安装了Scrapy的virtualenv中运行。当我激活虚拟环境并执行脚本
python main.py
时,命令scrapy -h
可以正常执行。现在,我需要将该脚本作为systemd服务运行。我已经创建了该脚本的systemd unit,如下所示:
[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中未安装的模块时,该脚本会更早地引发异常。