एक virtualenv एक पायथन स्क्रिप्ट के साथ सक्रिय करें


89

मैं पायथन स्क्रिप्ट से एक virtualenv उदाहरण को सक्रिय करना चाहता हूं।

मुझे पता है कि यह करना काफी आसान है, लेकिन मैंने जितने भी उदाहरण देखे हैं, वे इसका उपयोग एनवी के भीतर कमांड्स चलाने के लिए करते हैं और फिर सबप्रोसेस को बंद कर देते हैं।

मैं बस virtualenv को सक्रिय करना चाहता हूं और शेल पर वापस आता हूं, उसी तरह जो बिन / सक्रिय करता है।

कुछ इस तरह:

$me: my-script.py -d env-name
$(env-name)me:

क्या यह संभव है?

से मिलता जुलता:

virtualenv ›एक स्क्रिप्ट से एक एनवी को शामिल करना

जवाबों:


86

यदि आप virtualenv के तहत पायथन सबप्रोसेस चलाना चाहते हैं, तो आप ऐसा कर सकते हैं कि Python दुभाषिया का उपयोग करके स्क्रिप्ट चलाकर जो virtualenv / bin / directory के अंदर रहता है:

import subprocess

# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

हालाँकि, यदि आप उपप्रकार के बजाय वर्तमान पायथन दुभाषिया के तहत virtualenv को सक्रिय करना चाहते हैं, तो आप activate_this.pyस्क्रिप्ट का उपयोग कर सकते हैं :

# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))

1
//, क्या इस उत्तर पर पहले कोड ब्लॉक में अंतिम पंक्ति इस प्रकार नहीं पढ़ी जानी चाहिए subprocess.Popen([venv_python_file, script_file]):?
नाथन बसानी 21

//, इसके अलावा, क्या script_fileकिसी अनियंत्रित स्थान से चलने का कोई तरीका है , या क्या उसे virtualenvनिर्देशिका में होना चाहिए ?
नाथन बसानी 21

फिक्स्ड, त्रुटि को नोटिस करने के लिए धन्यवाद। आपके दूसरे प्रश्न के लिए, script_filevirtualenv निर्देशिका में होने की कोई आवश्यकता नहीं है, यह कहीं भी हो सकता है।
रेयान

यदि मैं दूसरे विकल्प का उपयोग कर रहा हूं, तो मैं वर्चुअल एनवी को कैसे निष्क्रिय कर सकता हूं?
झूठे जेब

@falsePockets: XY समस्या , आप कभी ऐसा क्यों करना चाहते हैं?
रेयान

42

वर्चुअनव्यू की दुभाषिया के तहत अपनी स्क्रिप्ट को चलाने का सबसे सरल उपाय यह है कि डिफ़ॉल्ट वर्थबंग लाइन को अपने वर्चुअनव इंटरप्रेटर के रास्ते से बदल दिया जाए, जैसे स्क्रिप्ट की शुरुआत में:

#!/path/to/project/venv/bin/python

स्क्रिप्ट को निष्पादन योग्य बनाएं:

chmod u+x script.py

स्क्रिप्ट चलाएँ:

./script.py

देखा!


2
लालित्य के लिए +1। खिड़कियों पर ध्यान दें इसके लिए एक
सकारात्मक कंप्लसिव

1
अजगर 3.6.3 और विंडोज़ 10 के लिए काम करता है!
toonarmycaptain करें

मुझे लगता है कि मैंने मूल प्रश्न को गलत समझा होगा। वह वर्चुअल वातावरण को एक स्क्रिप्ट के साथ सक्रिय करना चाहता है और सक्रिय वातावरण के साथ शेल पर लौटना चाहता है। मेरा उत्तर आभासी वातावरण में स्क्रिप्ट चलाता है लेकिन लौटाया गया शेल पर्यावरण को बनाए नहीं रखता है। आधुनिक दिन का समाधान virtualenvwrapper है: virtualenvwrapper.readthedocs.io/en/laty/# । यह एक को अलग-अलग virtualenvs के बीच सक्रिय और स्विच करने की अनुमति देता है।
nafooesi

20

यह पता चला है कि, समस्या सरल नहीं है, लेकिन समाधान है।

पहले मुझे "स्रोत" कमांड को लपेटने के लिए एक शेल स्क्रिप्ट बनानी पड़ी। कहा कि मैंने "का उपयोग किया।" इसके बजाय, क्योंकि मैंने पढ़ा है कि बैश स्क्रिप्ट के लिए स्रोत की तुलना में इसका उपयोग करना बेहतर है।

#!/bin/bash
. /path/to/env/bin/activate

फिर अपनी पायथन लिपि से मैं बस यही कर सकता हूं:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

पूरी ट्रिक --rcfileतर्क के भीतर निहित है।

जब पायथन दुभाषिया बाहर निकलता है तो यह सक्रिय वातावरण में वर्तमान शेल को छोड़ देता है।

जीत!


3
मैं वास्तव में यह नहीं मिलता है। आप ऐसा क्यों नहीं करते हैं: os.system('/bin/bash --rcfile path/to/env/activate') आप जानते हैं, जब बैश का एक उदाहरण शुरू किया जाता है, तो --rcfile के तर्क के रूप में .bashrc लेता है। तो बस निर्दिष्ट करें कि rcfile आपकी सक्रिय फ़ाइल है ... नहीं?
डीपा

@Depado मैं सिर्फ आपके समाधान की कोशिश की और यह अजगर के भीतर खोल को सक्रिय करेगा। कम से कम जब मैं इसे शेल में आज़माता हूं। >>> os.system ('/ bin / bash --rcfile / var / envs / test / bin / activate') (परीक्षण) tcraig @ longis-desktop: ~ $ (test) tcraig @ longis-desktop: ~ $ ls -एल कुल 706288
ट्रेंटन

हो सकता है लेकिन यह एक स्क्रिप्ट में काम करता है। इस तकनीक के साथ एकमात्र असुविधाजनक यह है कि आपको अपने सभी उपनाम और आपके ~ / .bashrc में सब कुछ नहीं मिलता है। लेकिन मैं इसके साथ ठीक हूं। उदाहरण के लिए "ls" कमांड का कोई रंग नहीं है। लेकिन मेरे लिए सब कुछ काम करता है। जब मैं छोड़ना चाहता हूं, मैं सिर्फ
12+ पर

7
"जब अजगर दुभाषिया बाहर निकलता है तो यह सक्रिय वातावरण में वर्तमान शेल को छोड़ देता है" क्या? यह सबप्रोसेस के रूप में एक बिल्कुल नया शेल पैदा करता है और इसके खत्म होने तक इंतजार करता है।
कोस

मेरी रिपॉजिटरी पर अधिक नई फाइलें बनाने से बचने के लिए और वर्तमान बैश कॉन्फिग को दोहराने के लिए, मैंने यह किया:cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
व्हाट्स

17

आधिकारिक Virtualenv प्रलेखन के अनुसार एक और पायथन वातावरण चलाने के लिए , कमांड लाइन में आप निष्पादन योग्य पायथन बाइनरी के लिए पूर्ण पथ निर्दिष्ट कर सकते हैं, बस (इससे पहले virtualenv को सक्रिय करने की आवश्यकता नहीं है):

/path/to/virtualenv/bin/python

यदि आप अपने virtualenv के साथ कमांड लाइन से स्क्रिप्ट मंगवाना चाहते हैं तो यही बात लागू होती है। इससे पहले आपको इसे सक्रिय करने की आवश्यकता नहीं है:

me$ /path/to/virtualenv/bin/python myscript.py

Windows परिवेश के लिए समान (चाहे वह कमांड लाइन से हो या स्क्रिप्ट से):

> \path\to\env\Scripts\python.exe myscript.py

2
प्रश्न है: एक आभासी स्क्रिप्ट को एक अजगर लिपि के साथ सक्रिय करें (शेल से नहीं)
ज़हीर

3
हां, मेरा कहना यह है कि आप सिर्फ एक आभासी वातावरण से अजगर रनटाइम को कंसोल से या स्क्रिप्ट से पहले सक्रिय करने की आवश्यकता के बिना कॉल कर सकते हैं। मैं जवाब स्पष्ट करूंगा, धन्यवाद!
मारियानो रुइज

हे भगवान! मैंने इसके बारे में नहीं सोचा था। यह एकमात्र समाधान है जिसने मेरे लिए काम किया :)। अब, जब मैं php से python script निष्पादित कर रहा हूं, मैं उपयोग कर रहा हूं: "path / to / virtualenv / bin / python mypythonscript.py"
Zaheer

6

बस एक सरल उपाय जो मेरे लिए काम करता है। मुझे नहीं पता कि आपको बैश स्क्रिप्ट की आवश्यकता क्यों है जो मूल रूप से एक बेकार कदम है (क्या मैं गलत हूं?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

मूल रूप से आपको क्या चाहिए:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

फिर आभासी वातावरण को निष्क्रिय करने के बजाय, बस Ctrl+ Dया बाहर निकलें। यह एक संभव समाधान है या नहीं है कि आप क्या चाहते थे?


2

बच्चे की प्रक्रिया का पर्यावरण उस क्षण में खो जाता है जब उसका अस्तित्व समाप्त हो जाता है, और वहां से पर्यावरण सामग्री को माता-पिता तक ले जाना कुछ मुश्किल होता है।

आपको शायद एक शेल स्क्रिप्ट (आप गतिशील रूप से / tmp पर एक उत्पन्न कर सकते हैं) जो एक फ़ाइल में वर्चुअन वातावरण चर का उत्पादन करेगी, जिसे आप तब माता-पिता पायथन प्रक्रिया में पढ़ते हैं और os.environ में डालते हैं।

या आप बस खुले ("बिन / सक्रिय") में लाइन का उपयोग करने के लिए सक्रिय स्क्रिप्ट को पार्स करते हैं, मैन्युअल रूप से सामान निकालते हैं, और ओएस.इनचेन में डालते हैं। यह मुश्किल है, लेकिन असंभव नहीं है।


2
क्या आपका मतलब इस तरह की किसी चीज से है ? bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/…
h3।

2

शीर्ष उत्तर केवल पायथन 2.x के लिए काम करता है

पायथन 3.x के लिए, इसका उपयोग करें:

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

संदर्भ: पायथन 3 में निष्पादन का एक विकल्प क्या है?


1
क्या है
randy Pen

1
@randyPen, जब आप अपने प्रोजेक्ट डायरेक्टरी में virtualenv का निर्माण करते हैं, तो activate_this.py फ़ाइल अपने आप जुड़ जाती है। (अर्थात /project/directory/venv/bin/activate_this.py)
सैद्धांतिक रूप से

-2

आपको अपना सभी virtualenvs एक फोल्डर में बनाना चाहिए , जैसेvirt

अपना वर्चुअलाइव फ़ोल्डर नाम मान लेना पुण्य है, अगर इसे बदलना नहीं है

cd
mkdir custom

नीचे की पंक्तियों को कॉपी करें ...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

एक शेल स्क्रिप्ट फ़ाइल बनाएँ और उपरोक्त पंक्तियाँ चिपकाएँ ...

touch custom/vhelper
nano custom/vhelper

आपकी फ़ाइल के लिए निष्पादन योग्य अनुमति प्रदान करें:

sudo chmod +x custom/vhelper

अब उस कस्टम फ़ोल्डर पथ को निर्यात करें ताकि आप टैब पर क्लिक करके इसे कमांड-लाइन पर पा सकें ...

निर्यात पथ = $ पथ: "$ घर / कस्टम"

अब आप नीचे दिए गए कमांड को टाइप करके इसे कहीं से भी उपयोग कर सकते हैं ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

मान लीजिए कि यह एबीसी है तो ...

vhelper abc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.