2016-05-13 18 views
23

Tôi muốn "kích hoạt" virtualenv trong tệp dịch vụ systemd.Làm thế nào để kích hoạt virtualenv trong một đơn vị dịch vụ systemd?

Tôi muốn tránh có quá trình shell giữa quá trình systemd và trình thông dịch python.

giải pháp hiện tại của tôi trông như thế này:

[Unit] 
Description=fooservice 
After=syslog.target network.target 

[Service] 
Type=simple 
User=fooservice 
WorkingDirectory={{ venv_home }} 
ExecStart={{ venv_home }}/fooservice --serve-in-foreground 
Restart=on-abort 
EnvironmentFile=/etc/sysconfig/fooservice.env 

[Install] 
WantedBy=multi-user.target 

/etc/sysconfig/fooservice.env

PATH={{ venv_home }}/bin:/usr/local/bin:/usr/bin:/bin 
PYTHONIOENCODING=utf-8 
PYTHONPATH={{ venv_home }}/... 
VIRTUAL_ENV={{ venv_home }} 

Nhưng tôi đang gặp khó khăn. Tôi nhận được ImportErrors kể từ khi một số enties trong sys.path là mất tích.

+0

bạn có thể vui lòng bao gồm các lỗi bạn đang nhận được? –

+0

@PraveenYalagandula Truy nguyên không chứa bất kỳ thông tin hữu ích nào, vì Ngoại lệ ImportError và tất cả các dòng ở trên nó chỉ chứa mã tùy chỉnh không quan trọng ở đây. – guettli

Trả lời

32

Virtualenv được "đưa vào trình thông dịch Python trong virtualenv". Điều này có nghĩa bạn có thể khởi python hoặc console_scripts trực tiếp trong virtualenv đó và không cần phải kích hoạt virtualenv đầu tiên hoặc quản lý PATH mình .:

ExecStart={{ venv_home }}/bin/fooservice --serve-in-foreground 

hoặc

ExecStart={{ venv_home }}/bin/python {{ venv_home }}/fooservice.py --serve-in-foreground 

và loại bỏ các mục EnvironmentFile.

Để xác minh rằng nó thực sự là chính xác bạn có thể kiểm tra bằng cách chạy sys.path

{{ venv_home }}/bin/python -m site 

và so sánh sản lượng để

python -m site 
+0

Có, sys.path là chính xác. Cảm ơn bạn. Tôi đã kiểm tra sự khác biệt giữa os.environ. Có vẻ như VIRTUAL_ENV không được đặt, nếu tôi sử dụng '{{venv_home}}/bin/python'. Điều này có gây rắc rối không? – guettli

+0

Tôi không biết chắc chắn nhưng tôi chưa bao giờ gặp sự cố với 'VIRTUAL_ENV' chưa được đặt. –

+1

Điểm tốt Nils. Btw, fooservice.py không có ý nghĩa khi nằm trong thư mục venv_home, tôi cho rằng đó là lỗi đánh máy trong câu hỏi. – chefarov

0

tôi không sử dụng virtualenv nhưng pyenv: ở đây là nó chỉ để sử dụng đường dẫn .pyenv thực trong shebang và đảm bảo rằng nó nằm trong PATH

Ví dụ: pyenv kích hoạt bình-prod cho người dùng mortenb đang chạy trong sản xuất

/home/mortenb/.pyenv/versions/flask-prod/bin/python --version 
Python 3.6.2 

Sau đó, để kịch bản bình của tôi bắt đầu từ năm systemd * .service tôi thêm các công việc sau:

#!/home/mortenb/.pyenv/versions/flask-prod/bin/python3 
Các vấn đề liên quan