2016-07-22 158 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