एक virtualenv फ़ोल्डर का नाम बदले बिना


162

मैंने फ़ोल्डर बनाया है और इसमें एक virtualenv उदाहरण इनिशियलाइज़ किया है।

$ mkdir myproject
$ cd myproject
$ virtualenv env

जब मैं (env)$ pip freezeचलता हूं , तो यह स्थापित पैकेजों को दिखाता है जैसा कि इसे करना चाहिए।

अब मैं नाम बदलना चाहते हैं myproject/करने के लिए project/

$ mv myproject/ project/

हालाँकि, अब जब मैं दौड़ता हूँ

$ . env/bin/activate
(env)$ pip freeze

यह कहता है कि पाइप स्थापित नहीं है। मैं पर्यावरण को तोड़े बिना प्रोजेक्ट फ़ोल्डर का नाम कैसे बदलूं?


1
यह प्रश्न पुराना है और पहले से ही एक उत्तर है, लेकिन मुझे आश्चर्य है कि, ओपी सिर्फ virtualenv को वापस क्यों नहीं ले सकता है जहां यह था? जाहिर है कि यह चाल / नाम बदलने की इच्छा को हल नहीं करता है, लेकिन क्या यह काम करने वाले वर्चुअन को पुनर्स्थापित नहीं करेगा, या यह पहले से ही टूट गया है?
मलिक ए। रूमी

2
हां, आप सही हैं, यह वर्चुअल एनवी की मरम्मत करेगा, लेकिन समस्या को हल नहीं करेगा।
फ्लोरियन

नवंबर 2019, पायथन 3। मेरे लिए सबसे अच्छा समाधान aarongorka.com/blog/portable-virtualenv
Samir Sadek

जवाबों:


148

आपको सापेक्ष पथों का उपयोग करने के लिए अपने इंस्टॉल को समायोजित करने की आवश्यकता है। virtualenvइसके लिए --relocatableविकल्प के साथ प्रदान करता है । से डॉक्स :

आम तौर पर वातावरण एक विशिष्ट पथ से बंधा होता है। इसका मतलब है कि आप किसी वातावरण को इधर-उधर नहीं कर सकते या उसे दूसरे कंप्यूटर पर कॉपी नहीं कर सकते। आप कमांड के साथ इसे स्थानांतरित करने के लिए वातावरण को ठीक कर सकते हैं:

$ virtualenv --relocatable ENV

नोट: ENV आभासी वातावरण का नाम है और आपको इसे ENV निर्देशिका के बाहर से चलाना होगा।

यह सेट-अप द्वारा बनाई गई कुछ फ़ाइलों को बनाएगा या संबंधित रास्तों का उपयोग वितरित करेगा, और वातावरण का चयन करने के लिए पायथन इंटरप्रेटर के स्थान का उपयोग करने के बजाय activate_this.py का उपयोग करने के लिए सभी लिपियों को बदल देगा।

नोट: वातावरण में किसी भी पैकेज को स्थापित करने के बाद आपको इसे चलाना होगा। यदि आप एक वातावरण को स्थानांतरित करने योग्य बनाते हैं, तो एक नया पैकेज स्थापित करें, आपको फिर से virtualenv --relocatable चलाना होगा।


2
चेतावनी: स्थानांतरित करने के लिए एक env बदलने से आप फ़ोल्डर ले जाने की तुलना में अधिक है। ( नोट देखें : डॉक्स से कॉपी किया गया) ... इसके दुष्प्रभाव हो सकते हैं।
बेन रॉबर्ट्स

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

1
@ डेमेज grep -EIr '\Wold_venv_name\W' /path/to/new_venvकिसी भी ऐसे शंग को ढूंढने में मदद करेगा जो पुराने वेनव का उपयोग करते हैं, लेकिन स्थानांतरित वेनव का पूर्ण सत्यापन नहीं है।
hobs

2
इसके अलावा, आपको virtualenvwrapper .projectफ़ाइल को संपादित करना होगा , जिसमें वो स्रोत कोड का पथ शामिल है जो virtualenv पर निर्भर करता है, यह मानते हुए कि आप virutalenvwrapper का उपयोग कर रहे हैं और नए virtualenv से मिलान करने के लिए प्रोजेक्ट dir का नाम भी बदला है।
hobs

मुझे इसे चलाने से पहले virtualenv को निष्क्रिय करना था।
एन्टनगैस्टम

108

मेरा मानना ​​है कि "यह जानना" क्यों "कैसे" से अधिक मायने रखता है । तो, यहाँ इसे ठीक करने के लिए एक और तरीका है।

जब आप दौड़ते हैं . env/bin/activate, तो यह वास्तव में निम्नलिखित कमांड्स ( /tmpउदाहरण के लिए) का उपयोग करता है :

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

हालाँकि, आपने अभी नाम बदल दिया myprojectहै project, ताकि कमांड निष्पादित करने में विफल रहे। ऐसा इसलिए कहा गया है pip is not installed, क्योंकि आपने pipसिस्टम वैश्विक परिवेश में स्थापित नहीं किया है और आपका वर्चुअन pipसही ढंग से उपलब्ध नहीं है।

यदि आप इसे मैन्युअल रूप से ठीक करना चाहते हैं, तो यह तरीका है:

  1. विम जैसे अपने पसंदीदा संपादक के साथ, /tmp/project/env/bin/activateआमतौर पर पंक्ति 42 में संशोधित करें :

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. /tmp/project/env/bin/pipपंक्ति 1 में संशोधित करें :

    #!/tmp/myproject/env/bin/python => #!/tmp/project/env/bin/python

उसके बाद, अपने आभासी वातावरण को envफिर से सक्रिय करें , और आप देखेंगे कि आपका pipफिर से वापस आ गया है।


6
यदि मैन्युअल रूप से पथ बदलना वांछित है, तो यह ध्यान दिया जाना चाहिए कि दो से अधिक हार्ड-कोडेड फाइलें हैं। उन सब की तरह कुछ के साथ खोजें: grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name। वास्तव में, मैंने देखा कि मेरे एक Django उदाहरण में, बहुत सारे पैकेजों में "पायथन श-बैंग" का मार्ग था।
केविन

इसने मेरी बहुत मदद की। मुझे निश्चित रूप से यह जानने की आवश्यकता है कि क्यों ... धन्यवाद!
जार्विस

ऊपर कीवेन की टिप्पणी के विपरीत, मुझे लगता है कि इन दो पंक्तियों का संपादन मेरे लिए चलती समस्याओं के संबंध में सभी समस्याओं को हल करता है virtualenv। शायद कुछ उपयोग मामला है जो मैं उपयोग नहीं कर रहा हूं और इसलिए समस्या का सामना नहीं करना है।
18

उसको खरोंचो! आज मैं एक समस्या में भाग गया: ipython के भीतर काम नहीं करेगा virtualenv। इसे हल करने के लिए, मैंने ipythonफ़ाइल में बैश हेडर (इसे क्या कहा जाता है?) को संपादित किया और फिर ठीक काम किया।
देलेत

हम्म यह मेरे लिए काम नहीं कर रहा है, और ऐसा लगता है कि मेरी सक्रिय स्क्रिप्ट में लाइन 1 नहीं है जिसे यहां चरण 2 में संदर्भित किया गया है। क्या कुछ परिवर्तन हुआ?
इवान ज़मीर

40

नोट: @jb के रूप में। बताते हैं, यह समाधान केवल आसानी से (पुनः) निर्मित virtualenvs पर लागू होता है । यदि इस समाधान को स्थापित करने के लिए वातावरण में कई घंटे लगते हैं, तो इसकी अनुशंसा नहीं की जाती है


वर्चुअन महान हैं क्योंकि वे बनाने और चारों ओर स्विच करने में आसान हैं; वे आपको एकल कॉन्फ़िगरेशन में लॉक होने से बचाते हैं। यदि आप परियोजना की आवश्यकताओं को जानते हैं, या उन्हें प्राप्त कर सकते हैं, तो एक नया बनाएँvirtualenv :

  • एक requirements.txtफ़ाइल बनाएँ

    (env)$ pip freeze > requirements.txt

    • यदि आप requirements.txtफ़ाइल नहीं बना सकते हैं , तो env/lib/pythonX.X/site-packagesमूल को हटाने से पहले जांचें env
  • मौजूदा को हटा दें (env)

    deactivate && rm -rf env

  • एक नया बनाएँ virtualenv, इसे सक्रिय करें और आवश्यकताओं को स्थापित करें

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


वैकल्पिक रूप से, चीजों को थोड़ा आसान बनाने के लिए virtualenvwrapper का उपयोग करें क्योंकि सभी virtualenvs को एक केंद्रीकृत स्थान पर रखा जाता है

$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv

6
कुछ लोगों के लिए अच्छी तरह से कुछ pip install -r requirements.txtघंटे लगते हैं (रास्पबेरी पाई पर तीसरे पक्ष के सी-एक्सटेंशन का संकलन)।
जेबी

4
शायद सच है, लेकिन यह मेरे लिए एक किनारे की तरह लगता है। मुझे अभी भी लगता है कि यह कई मामलों के लिए एक व्यवहार्य समाधान हो सकता है।
bnjmn

याह, कई परियोजनाएं (उदाहरण के लिए, Django वेबसाइट) सब कुछ स्थापित करने के लिए केवल 30 सेकंड लेती हैं, भले ही उनके पास दो दर्जन निर्भरताएं हों (बशर्ते आप सब कुछ पहले डाउनलोड करें और '--no-index --find-links = downloadDir' का उपयोग करें। )
जोनाथन हार्टले

1
@bnjmn वन-लाइनर virtualenv env && pip install -r requirements.txtनए वातावरण में आवश्यकताओं को स्थापित नहीं करेगा क्योंकि आप इसे सक्रिय नहीं करते हैं
यार्न

1
@ यारिन यह इंगित करने के लिए धन्यवाद। मैं इसे पूरी तरह से याद कर रहा था, virtualenv-wrapperखुद उपयोगकर्ता था (जो ऑटो निर्माण पर सक्रिय है)। मैंने virtualenvकिसी भी भ्रम से बचने की उम्मीद में सक्रिय करने के लिए अपने उत्तर को अपडेट किया है।
bnjmn

28

मैं हमेशा मदद करने के लिए virtualenvwrapper स्थापित करता हूं। शेल प्रॉम्प्ट से:

pip install virtualenvwrapper

Virtualenvwrapper दस्तावेजों में एक तरीका है - cpvirtualenv यह वही है जो आप करते हैं। सुनिश्चित करें कि आप अपने वातावरण से बाहर हैं और शेल प्रॉम्प्ट पर वापस जाएं। इसमें आवश्यक नाम के साथ टाइप करें:

cpvirtualenv oldenv newenv

और फिर, यदि आवश्यक हो:

rmvirtualenv oldenv

अपने newenv पर जाने के लिए:

workon newenv

1
माइक्रोवेव का जवाब वास्तव में स्वीकृत तरीका होना चाहिए।
१२

यह केवल तभी काम करता है जब कोई उपयोग कर रहा है virtualenvwrapper, न कि सिर्फ virtualenv। @Ryankdwyer का यह जवाब बेहतर है।
एलएस

मैंने अपना उत्तर यह दर्शाने के लिए संपादित किया कि किसी को 'virtualenvwrapper' स्थापित करना चाहिए। यह मानते हुए कि आभासी वातावरण का नाम बदलने से बहुत कुछ होता है, मैं इस तरह से सिफारिश करूंगा।
अफ़गान

भले ही यह virtualenvwrapper पर निर्भर करता है, यह सबसे सरल है। और यह अच्छी तरह से काम करता है।
ब्लैसरोड्री

17

आप इन चरणों का पालन करके अपनी समस्या को ठीक कर सकते हैं:

  1. अपनी निर्देशिका का नाम बदलें
  2. इसे फिर से चलाएँ: $ virtualenv ..\path\renamed_directory
  3. virtualenv आपके संकुल को जगह में छोड़ते समय निर्देशिका संघों को सही करेगा
  4. $ scripts/activate
  5. $ pip freeze अपने पैकेजों को सत्यापित करने के लिए जगह में हैं
  6. एक महत्वपूर्ण चेतावनी, यदि आपके पास अपने virtualenv निर्देशिका में स्क्रिप्ट फ़ाइलों में कोई स्थिर पथ निर्भरता है, तो आपको मैन्युअल रूप से उन्हें बदलना होगा।

1
यह मेरे लिए बहुत अच्छा समाधान था। चूंकि यह समाधान कुछ समस्याओं से जुड़ा हो सकता है--relocatable , इसलिए मुझे लगता है कि यह समाधान स्वीकृत उत्तर से बेहतर है। अब तक, मैंने देखा है कि कई .pycफाइलें _new_name_/lib/python2.7अभी भी संदर्भित हैं _old_name_। हालाँकि, यह प्रभावित नहीं करता है कि मेरा पर्यावरण कैसे काम करता है। हो सकता है कि एकमात्र बेहतर समाधान उपयोग कर रहा हो virtualenvwrapperया यहां दिए गए जवाबों के बीच कुछ अन्य उपयोगिताओं का उल्लेख किया गया हो। कम से कम इस समाधान के लिए अतिरिक्त प्रोग्राम स्थापित करने की आवश्यकता नहीं है।
एलएस

एक जादू की तरह काम करता है!
अमीरहोसिन

13

फिर भी ऐसा करने का एक और तरीका जो मेरे लिए कई बार समस्याओं के बिना काम करता है वो है virtualenv-clone :

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env

इसे सर्वश्रेष्ठ उत्तर के रूप में चिह्नित किया जाना चाहिए। हाथ नीचे! क्लोन करने में थोड़ा समय लगा, इसलिए धैर्य रखें।
अमितजीत बोस

virtualenv-clone प्रॉम्प्ट को अद्यतन करने के लिए उपेक्षा करता है। मैन्युअल रूप से ऐसा करना था। इसके अलावा, यह बहुत अच्छा है।
user3667349

5

(प्रोजेक्ट फ़ोल्डर के अंदर)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

निष्क्रिय और सक्रिय करना मत भूलना


अच्छा काम करता है; या लिनक्स पथ के लिए:sed -i "s|$old_dir|$new_dir|g" bin/*
नाशिका

sed -i '.original' 's/old_dir_name/new_dir_name/g' *मैक के लिए
एलेक्स

1

virtualenv --relocatable ENVएक वांछनीय समाधान नहीं है। मुझे लगता है कि अधिकांश लोग बिना किसी दीर्घकालिक दुष्प्रभावों के एक वर्चुअन का नाम बदलने की क्षमता चाहते हैं।

इसलिए मैंने ऐसा करने के लिए एक सरल टूल बनाया है। Virtualenv-mv के लिए प्रोजेक्ट पेज इसे और अधिक विस्तार से रेखांकित करता है, लेकिन अनिवार्य रूप से आप इसका उपयोग कर सकते हैं virtualenv-mvजैसे आप mv(बिना किसी विकल्प के) एक सरल कार्यान्वयन का उपयोग करेंगे ।

उदाहरण के लिए:

virtualenv-mv myproject project

कृपया ध्यान दें कि मैंने अभी इसे हैक किया है। यह असामान्य परिस्थितियों में टूट सकता है (उदाहरण के लिए वर्चुअलाइज्ड वीवीएन) ताकि कृपया सावधान रहें (जो आप खोना नहीं छोड़ सकते हैं) और मुझे बताएं कि क्या आपको कोई समस्या आती है।

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