2016-07-22 3 views
4

을 사용하는 Python 스크립트가 있고 pip install zmq을 통해이 라이브러리를 설치했으며 명령 줄을 통해 수동으로 호출하면 프로그램을 잘 실행할 수 있습니다. 그러나 systemd 유닛에서 스크립트를 호출하려고 시도하면 systemctl status myservice.service을 실행하면 ImportError: No module named zmq이 표시됩니다.시스템을 통한 Python 스크립트 실행 중 모듈로드 실패

내 서비스 파일은 다음과 같습니다 runpythonscript.sh 루트로 내 파이썬 스크립트를 실행하는 매우 간단한 쉘 스크립트입니다

[Unit] 
Description=Does Something 

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

[Install] 
Alias=myservice.service 

. 커맨드 라인에서이 셸 스크립트를 수동으로 실행하면 파이썬 프로그램이 완전히 실행되지만 서비스 호출을하면 zmq 모듈을 찾지 못하게됩니다.

도움을 주시면 감사하겠습니다.

답변

5

systemd 실행. pip을 통해 설치된 모듈은 시스템이 아닌 사용자를 위해 설치되므로 루트 권한없이 모듈을 설치하면 루트 권한으로 모듈을 액세스 할 수 없게됩니다.

이 문제를 해결하기 위해 나는 sudo -H pip install zmqsudo -H pip3 install zmq을 실행하여 루트 용 Python 2.7 및 Python 3+ 용 패키지를 설치했습니다. 이렇게하면 systemd이 파이썬 스크립트를 실행하려고 시도한 후에 모듈에 액세스 할 수있었습니다.

2

가장 가능성있는 설명은 스크립트가 systemd에 의해 실행될 때 설정되지 않은 일부 환경 변수 (예 : PYTHONPATH? 확장자)가 설정되어 있다는 것입니다.

환경 매개 변수 ([0] 참조)를 사용하여 PYTHONPATH (및 기타 영향을 줄 수있는 모든 것)를 콘솔 세션에있는 값으로 설정할 수 있습니다.

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

+0

감사합니다 문제는 .bash_profile에에 내가 좋아하는 뭔가를하였습니다이었다! 이 대답은 마침내 내가 찾지 못한 답변을 여러 시간 동안 찾은 후에도 프로젝트가 작동하도록하는 데 도움이되었습니다. – dtgee

0

제 경우에는 "EnvironmentFile ="을 사용자 .bash_profile에 설정합니다.

export PYTHONPATH=.... 
export PATH=.... 
이 systemd와 함께 일하지 않았다

나는에 있었다으로 변경 :

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