2016-07-22 153 views
4

我有一个使用zmq的Python脚本,我已经通过pip install zmq安装了这个库,如果通过命令行手动调用,我可以运行程序。但是,只要我尝试让systemd单元调用脚本,运行systemctl status myservice.service就会显示ImportError: No module named zmq通过systemd运行Python脚本无法加载模块

我的服务文件是这样的:

[Unit] 
Description=Does Something 

[Service] 
Type=simple 
ExecStart=/bin/sh /var/lib/project/runpythonscript.sh 
Restart=always 

[Install] 
Alias=myservice.service 

哪里runpythonscript.sh是运行我的python脚本作为根一个非常简单的shell脚本。从命令行手动运行这个shell脚本运行我的python程序时完全正常,但有服务调用它导致它找不到zmq模块。

任何帮助表示赞赏。

回答

5

systemd运行作为根。通过pip安装的模块是为用户安装的,而不是为系统安装的,因此安装没有root权限的模块使得模块无法访问root用户。

为了解决这个问题,我运行了sudo -H pip install zmqsudo -H pip3 install zmq来为root用户安装Python 2.7和Python 3+的软件包。这允许systemd在尝试执行Python脚本时访问这些模块。

2

最有可能的解释是,您有一些环境变量设置(例如您的PYTHONPATH的扩展?),当脚本由systemd运行时,它没有设置。

您可以尝试使用Environment参数(请参阅[0]),以便将PYTHONPATH(以及任何可能影响此参数的设置)设置为控制台会话中的任何内容。

[0] http://0pointer.de/public/systemd-man/systemd.exec.html#Environment=

+0

谢谢!这个答案终于帮助我让我的项目在几个小时寻找没有的答案后工作。 – dtgee

0

在我的情况下,我将“EnvironmentFile =”设置为用户.bash_profile。问题是,在.bash_profile中我有这样的:

export PYTHONPATH=.... 
export PATH=.... 

这并没有用systemd工作,我不得不把它改为:

PYTHONPATH=.... 
PATH=.... 
export PYTHONPATH PATH