2016-01-27 10 views
9

मैं (--copies साथ स्पष्ट रूप से परहेज सिमलिंक,) एक python3 आभासी वातावरण बनाने:पूरी तरह से आत्म निहित आभासी वातावरण

» tree venv/ 
venv/ 
├── bin 
│   ├── activate 
│   ├── activate.csh 
│   ├── activate.fish 
│   ├── python 
│   └── python3 
├── include 
├── lib 
│   └── python3.4 
│    └── site-packages 
├── lib64 -> lib 
└── pyvenv.cfg 

मैं को निष्क्रिय PYTHONPATH:

» python3 -m venv --without-pip --copies venv 

यह अब मेरा पूरा आभासी वातावरण है , यह सुनिश्चित करने के लिए कि बाहर से कुछ भी लीक नहीं हो रहा है:

» PYTHONPATH="" 

venv सक्रिय करें:

» source venv/bin/activate 

सत्यापित करें कि activate प्रदूषित नहीं किया है मेरी PYTHONPATH:

» echo $PYTHONPATH 

(खाली, उम्मीद के रूप में)

मैं सही अजगर का उपयोग कर रहा:

» which python 
/foo/bar/venv/bin/python 

लेकिन सिस्टम मॉड्यूल अभी भी बी हैं पहुँचा eing:

» python 
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import unittest 
>>> print(unittest) 
<module 'unittest' from '/usr/lib/python3.4/unittest/__init__.py'> 
>>> 

मैं के बाद से आभासी वातावरण में ऐसी कोई मॉड्यूल है import unittest बयान विफल उम्मीद होती है,।

मुझे पता करना चाहते हैं:

  • क्यों प्रणाली संकुल जब एक virtualenv में पहुँचा रहे हैं?
  • मैं पूरी तरह आत्मनिर्भर वर्चुअल वातावरण कैसे बना सकता हूं?

उत्तर

7

यदि मुझे सही ढंग से याद है कि कोर सिस्टम पैकेज सिम्लिंक हैं, तो वे वही फ़ाइलें हैं (आंशिक रूप से वर्चुअलएव के आकार को रखने के लिए)।

डिफ़ॉल्ट में site-packages निर्देशिका शामिल नहीं है, इसलिए यह स्थापित किए गए तृतीय पक्ष पुस्तकालयों तक नहीं पहुंच पाएगा।

यदि आप वास्तव में अलग और आत्मनिर्भर वर्चुअल वातावरण चाहते हैं, तो आप docker को देखकर बेहतर हो सकते हैं।

वर्चुअलएन्व विभिन्न ऐप्स के लिए विभिन्न तृतीय पक्ष स्थापित संकुल प्रबंधित करने का एक हल्का तरीका है।

संपादित करें:

यह --always-copy तरह लग रहा है वास्तव में हमेशा सभी फ़ाइलों की प्रतिलिपि नहीं करता है:

virtualenv doesn't copy all .py files from the lib/python directory

स्रोत में खुदाई और ऐसा लगता है कि वहाँ मॉड्यूल के एक छोटा सा सेट है कि समझा जाता है जैसे "आवश्यक" किया है और इन लोगों कि कॉपी कर रहे हैं कर रहे हैं:

https://github.com/pypa/virtualenv/blob/ac4ea65b14270caeac56b1e1e64c56928037ebe2/virtualenv.py#L116

संपादित करें 2:

आप देख सकते हैं कि पुराने अजगर निर्देशिका अभी भी sys.path में दिखाई देते हैं, लेकिन virtualenv खुद के लिए निर्देशिका के बाद:

>>> import sys 
>>> sys.path 
['', '/home/john/venv/lib/python2.7', 
'/home/john/venv/lib/python2.7/plat-linux2', 
'/home/john/venv/lib/python2.7/lib-tk', 
'/home/john/venv/lib/python2.7/lib-old', 
'/home/john/venv/lib/python2.7/lib-dynload', '/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/home/john/venv/local/lib/python2.7/site-packages', 
'/home/john/venv/lib/python2.7/site-packages'] 
+0

कृपया ध्यान दें कि मैं उपयोग कर रहा हूँ '--copies': कोई symlinks का उपयोग किया जाता है (जैसा कि निर्देशिका पेड़ में देखा गया है)। डॉकर मेरी जरूरतों के लिए अधिक है: मैं इस स्थिति के साथ * लाइव * कर सकता हूं, लेकिन मैं पृष्ठभूमि के मुद्दों को समझना चाहता हूं। हो सकता है कि सिस्टम की पायथन बाइनरी में एक अंतर्निहित पायथनपैथ (जिसे वर्चुअलएन्व में कॉपी किया गया हो)? यह कैसे किया जाता है? सिस्टम 'पायथन' बाइनरी स्थापित है (इस मामले में) 'एपीटी गेट' के साथ, तो पाइथन बाइनरी को यह पता चल जाएगा कि यह कहां स्थापित है (विशेष रूप से प्रतिलिपि बनाने के बाद!)? – dangonfast

+0

वहां '-कोपी' नहीं देखा गया था। मैंने स्थानीय रूप से '--always-copy' का उपयोग करके परीक्षण किया है ('- copies' पुराना नाम है?) और वह फ़ाइलों की प्रतिलिपि बनाता है, लेकिन अजीब * नहीं * unittest के लिए। यदि आप 'ओएस' मॉड्यूल के लिए एक ही परीक्षण का प्रयास करते हैं, तो आपको देखना चाहिए कि आपको सही रास्ता मिल गया है। –

+0

मेरे पास '--always-copy' विकल्प नहीं है, लेकिन' --copies' है। मुझे नहीं पता कि कौन सा पुराना है। मैं अजगर 3.4.3 का उपयोग कर रहा हूँ, और आप? – dangonfast

संबंधित मुद्दे