![systemd를 사용하여 Python 스크립트를 데몬화할 수 없습니다. 'oandapyV20'이라는 모듈이 없습니다.](https://rvso.com/image/170267/systemd%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20Python%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EB%8D%B0%EB%AA%AC%ED%99%94%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.%20'oandapyV20'%EC%9D%B4%EB%9D%BC%EB%8A%94%20%EB%AA%A8%EB%93%88%EC%9D%B4%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..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 script.py
또는 가상 환경 활성화
소스 /home/user/venv/bin/activate; python3 script.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
파이썬에게 로드할 모듈을 찾을 위치를 알려주어야 합니다. (를 사용하여 스크립트에서 수정하거나 읽을 수도 있습니다 sys.path
.)
이는 시스템 장치의 명령을 변경하는 것이 효과가 있었던 이유를 설명합니다. 마침내 작업 명령과 동일한 Python을 호출하게 됩니다.