python - एक systemen सर्विस यूनिट में virtualenv कैसे इनेबल करें?




environment-variables (2)

मैं एक virtualenv को एक systemd सर्विस फ़ाइल में "सक्रिय" करना चाहता हूँ।

मैं प्रणाली प्रक्रिया और अजगर दुभाषिया के बीच एक खोल प्रक्रिया करने से बचना चाहूंगा।

मेरा वर्तमान समाधान इस तरह दिखता है:

[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 }}

लेकिन मुझे परेशानी हो रही है। जब से कुछ sys.path में कुछ गुम हुए हैं, मुझे ImportErrors मिल गया है।


जबकि पुस्तकालयों के लिए पथ वास्तव में virtualenv के अजगर दुभाषिया में बेक किया गया है, मेरे पास अजगर उपकरण के साथ समस्याएँ हैं जो उस virtualenv में स्थापित बायनेरिज़ का उपयोग कर रहे थे। उदाहरण के लिए, मेरी अपाचे एयरफ्लो सेवा काम नहीं करेगी क्योंकि यह gunicorn बाइनरी नहीं मिल gunicorn । इसके चारों ओर काम करने के लिए, यहाँ मेरा ExecStart इंस्ट्रक्शन है, जिसमें Environment इंस्ट्रक्शन (जो कि सर्विस के लिए एनवायरनमेंट वेरिएबल सेट करता है) है।

ExecStart={{ virtualenv }}/bin/python {{ virtualenv }}/bin/airflow webserver
Environment="PATH={{ virtualenv }}/bin:{{ ansible_env.PATH }}"

ExecStart स्पष्ट रूप से virtualenv के अजगर इंटरप्रेटर का उपयोग करता है। मैं एक PATH वैरिएबल भी जोड़ रहा हूं, जो सिस्टम PATH से पहले virtualenv के बाइनरी फ़ोल्डर को जोड़ता है। इस तरह, मुझे वांछित अजगर पुस्तकालयों के साथ-साथ बायनेरिज़ भी मिलते हैं।

ध्यान दें कि मैं इस सेवा का निर्माण करने के लिए ansible का उपयोग कर रहा हूं, jinja2 के घुंघराले ब्रेस को मिटा दें।


मैं virtualenv का उपयोग नहीं कर रहा हूँ, लेकिन pyenv: यहाँ यह सिर्फ असली .pyenv पथ का उपयोग करने के लिए है और सुनिश्चित करें कि यह पथ में है

पूर्व: pyenv उपयोगकर्ता मोर्टेनब के लिए फ्लास्क-ठेस को सक्रिय करता है जो कि ठेस में चल रहा है

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

तब मेरी फ्लास्क लिपियों को systemd * .service में शुरू करके मैं निम्नलिखित शेबंग जोड़ता हूँ:

#!/home/mortenb/.pyenv/versions/flask-prod/bin/python3




virtualenv