आखिरकार ऐसा लगता है कि आपका प्रश्न वास्तव में यह पता लगाने के लिए है कि चल रहा पायथन वर्चुअलएव में है या नहीं। इसके निचले हिस्से तक पहुंचने के लिए हमें समझना होगा कि virtualenv
वास्तव में कैसे काम करता है।
यह सीधे virtualenv से python
चलाने के लिए पूरी तरह से स्वीकार्य है, और क्रम python
पर बिल्कुल VIRTUAL_ENV
चर का उपयोग नहीं करता है। इसके बजाए, यह python
बाइनरी वाली निर्देशिका को निर्धारित करता है और मूल निर्देशिका का उपयोग "उपसर्ग" के रूप में करता है।
आप sys
मॉड्यूल आयात करके sys.prefix
पर परामर्श करके सिस्टम के उपसर्ग को निर्धारित कर सकते हैं। हालांकि, वर्चुअलएव सक्रिय नहीं होने पर यह मान पर निर्भर होना एक बुरा विचार होगा क्योंकि यह पाइथन के लिए एक बिल्ड-टाइम सेटिंग है जिसे आसानी से अनुकूलित किया जा सकता है, और यह निश्चित रूप से प्लेटफ़ॉर्म के बीच भिन्न होगा। जब यह एक virtualenv उपसर्ग बनाम अपने संकलित में उपसर्ग से चलाता है
हालांकि, अजगर एक मामूली क्रम अंतर है: sys
पैकेज एक अतिरिक्त चर real_prefix
कि उपसर्ग कि अजगर बाइनरी में संकलित किया गया है देता है। इसलिए एक है कि अजगर एक गैर डिफ़ॉल्ट स्थान है, जो काफी संभावना है में चल रहा है पहचान करने के लिए यह एक virtualenv से चल रहा है मतलब के लिए इसका उपयोग कर सकते हैं:
import sys
if getattr(sys, "real_prefix", None) is not None:
print "Maybe in a virtualenv"
else:
print "Probably not in a virtualenv"
हालांकि, यहां तक कि यह एक सटीक विज्ञान नहीं है। यह सब वास्तव में आपको बताता है कि पाइथन बाइनरी संकलन समय पर निर्दिष्ट स्थान पर नहीं है।उपयोगकर्ता अपने ही तैयार की है, तो
: - यह आपको बता नहीं है वर्तमान उपयोगकर्ता /usr/share/man
को लिखने पर पहुंच है या वहाँ कुछ (संभवतः धार) ऐसे मामलों में जहां यह आप सही जवाब नहीं देंगे कर रहे हैं अपने घर निर्देशिका और उसकी संकलित उपसर्ग में स्रोत से अजगर /home/johnd/local-python
तो real_prefix
सेट नहीं किया जा जाएगा और उपयोगकर्ता अभी भी अपने अजगर lib
निर्देशिका लिखने की एक्सेस है, और शायद नहीं लेखन पहुँच /etc
करने के लिए या /usr/share/man
- इसी तरह
, कुछ सिस्टम पर व्यवस्थापक हो सकता है एप डेवलपर्स के एक निश्चित समूह को /usr/lib/python2.7
पर ग्रुप-राइट विशेषाधिकार दिए गए ताकि वे पाइथन मॉड्यूल इंस्टॉल कर सकें, लेकिन उन्हें अन्य सिस्टम फ़ाइलों तक पहुंच लिखने की अनुमति नहीं दी है।
तो मैं अंत में लगता है कि सबसे अच्छा आप कर सकते हैं के लिए अनुमान का है और यह बेहतर हो सकता है बजाय सिर्फ किसी भी मॉड्यूल आप एक virtualenv के अंदर इस्तेमाल किया जा करने की उम्मीद के लिए data_files
में पूर्ण पथ का उपयोग कर से बचने के लिए। एक समझौता आपके मॉड्यूल को दो वितरणों में विभाजित करने के लिए हो सकता है, जो स्थानीयकरण योग्य स्रोत फ़ाइलों का प्रतिनिधित्व करता है और दूसरा इसे चलाने के लिए सिस्टम-व्यापी कॉन्फ़िगरेशन का प्रतिनिधित्व करता है। उत्तरार्द्ध पूर्व पर निर्भर कर सकता है ताकि उपयोगकर्ता इसे आसानी से इंस्टॉल कर सकें, लेकिन virtualenv
का उपयोग करने वाले लोगों के पास अन्य पूर्व का उपयोग करने का विकल्प होता है।
स्रोत
2013-03-18 04:49:54
मेरे पास आपके प्रश्न का पूरा उत्तर नहीं है, लेकिन VIRTUAL_ENV की जांच करना भरोसेमंद नहीं है क्योंकि कोई भी वही प्रभाव प्राप्त करने के लिए वर्चुअलनेव की बिन निर्देशिका से "पायथन" बाइनरी को स्पष्ट रूप से चला सकता है। –
@MartinAtkins यकीन है? वास्तविक बाइनरी समान है: 'md5sum/tmp/bar/bin/python/usr/bin/python b35da8492c4ddb3e3413411e574db63a/tmp/bar/bin/python b35da8492c4ddb3e3413411e574db63a/usr/bin/python'। और मेरी समझ यह थी कि, मैंने * बिन/सक्रिय 'को सोर्स करके env को सक्रिय करने के लिए * किया है। – zhenech
नहीं, आपको env को सक्रिय करने की आवश्यकता नहीं है। आप 'cd/path/to/virtualenv' फिर' bin/python' ठीक कर सकते हैं। –