![無法使用 systemd 守護 python 腳本 - 沒有名為「oandapyV20」的模組](https://rvso.com/image/170267/%E7%84%A1%E6%B3%95%E4%BD%BF%E7%94%A8%20systemd%20%E5%AE%88%E8%AD%B7%20python%20%E8%85%B3%E6%9C%AC%20-%20%E6%B2%92%E6%9C%89%E5%90%8D%E7%82%BA%E3%80%8CoandapyV20%E3%80%8D%E7%9A%84%E6%A8%A1%E7%B5%84.png)
我正在嘗試使用 systemd 對 python 腳本進行守護進程,但在啟動守護進程後不斷收到錯誤「沒有名為『oandapyV20』的模組」。
腳本位於以下位置:/home/user/workingdir/script.py
虛擬環境位於:/home/user/venv/bin/
我對如何根據我找到的文檔建立服務的最佳猜測如下:
[Unit]
Description=DataLoader
[Service]
User=root
Group=root
WorkingDirectory=/home/user/workingdir
ExecStart=/home/user/venv/bin/python3 script.py
[Install]
WantedBy=multi-user.target
有什麼作用...
python3腳本.py
或啟動虛擬環境
源/home/user/venv/bin/activate; python3腳本.py
儘管這在服務之外有效,但從 systemd 呼叫時我嘗試過的任何方法都不起作用。
我哪裡錯了?我沒有意識到什麼?
最終解決方案(了解很少)
[Unit]
Description=DataLoader
[Service]
User={user_name}
Group={user_name}
WorkingDirectory=/home/{user_name}/workingdir
ExecStart=/usr/bin/python3 script.py
Restart=always
[Install]
WantedBy=multi-user.target
答案1
看來您一直在這樣的假設下進行操作:每當您調用 時source /home/user/venv/activate
,該python3
命令(以及該pip3
命令)隨後都會從 調用相關的可執行檔/home/user/venv/bin
。
但是,您在評論中添加的澄清表明假設是不正確的。運行時您沒有從虛擬環境中呼叫 python script.py
;你一直在調用python /usr/bin
(pip
似乎也有它相應的,因為你的virtualenv中的python似乎沒有oandapyV20
安裝該模組,而係統python卻安裝了。)
檢查輸出
echo $PATH
echo $PYTHONPATH
環境$PATH
變數是輸入指令時要搜尋的系統上以冒號分隔的路徑清單。要么/home/user/venv/bin
不存在於該列表中,要么出現在 出現之後/usr/bin
,其中包含 的匹配項python3
($PATH
將在第一個匹配後停止掃描。)通常由(或如果未在那裡設置)$PATH
設置,並且如果您的假設是正確的,本來會被設置在它前面。$HOME/.bashrc
/etc/bashrc
/home/user/venv/activate
$PATH
/home/user/venv/bin
$PYTHONPATH
應該告訴 python 在哪裡尋找要載入的模組。 (也可以使用 來修改或從腳本讀取它sys.path
。)
這解釋了為什麼改變你的 systemd 單元的命令有效——它最終調用了你的工作命令所執行的相同的 python。