2013-03-17 7 views
5

के दौरान पाइथन वर्चुअलएन्व से चल रहा है या नहीं, मेरे पास एक पाइथन सॉफ़्टवेयर है जिसमें एक कॉन्फ़िगरेशन फ़ाइल और एक मैनपेज शामिल है। इन स्थापित करने के लिए, मैं (http://docs.python.org/2/distutils/setupscript.html#installing-additional-files पर बताया गया है) मेरी setup.py में निम्न पंक्ति है:पैकेज इंस्टॉलेशन

data_files = [('/etc/foo', ['foo.conf']), ('/usr/share/man/man1', ['foo.1'])] 

यह सिर्फ ठीक काम करता है जब मैं python setup.py install साथ रूट के रूप में सॉफ्टवेयर स्थापित करना चाहते हैं, लेकिन निश्चित रूप से एक virtualenv में विफल रहता है, चूंकि उपयोगकर्ता को /etc और /usr/share/man पर लिखने की अनुमति नहीं है।

इसे ठीक करने का सबसे अच्छा अभ्यास क्या है? वर्तमान वातावरण में VIRTUAL_ENV के लिए जांचें और बस उन फ़ाइलों को इंस्टॉल न करें? सॉफ्टवेयर स्थानीय निर्देशिका में foo.conf के लिए देखेगा, इसलिए यह कोई समस्या नहीं होनी चाहिए। उपयोगकर्ता मैनपेज को याद करेगा, लेकिन इसे किसी भी तरह से स्थापित करने के लिए कोई रास्ता नहीं है, क्योंकि man वर्चुअलएन्व के पास कहीं भी इसकी तलाश नहीं करेगा।

+3

मेरे पास आपके प्रश्न का पूरा उत्तर नहीं है, लेकिन VIRTUAL_ENV की जांच करना भरोसेमंद नहीं है क्योंकि कोई भी वही प्रभाव प्राप्त करने के लिए वर्चुअलनेव की बिन निर्देशिका से "पायथन" बाइनरी को स्पष्ट रूप से चला सकता है। –

+0

@MartinAtkins यकीन है? वास्तविक बाइनरी समान है: 'md5sum/tmp/bar/bin/python/usr/bin/python b35da8492c4ddb3e3413411e574db63a/tmp/bar/bin/python b35da8492c4ddb3e3413411e574db63a/usr/bin/python'। और मेरी समझ यह थी कि, मैंने * बिन/सक्रिय 'को सोर्स करके env को सक्रिय करने के लिए * किया है। – zhenech

+1

नहीं, आपको env को सक्रिय करने की आवश्यकता नहीं है। आप 'cd/path/to/virtualenv' फिर' bin/python' ठीक कर सकते हैं। –

उत्तर

9

आखिरकार ऐसा लगता है कि आपका प्रश्न वास्तव में यह पता लगाने के लिए है कि चल रहा पायथन वर्चुअलएव में है या नहीं। इसके निचले हिस्से तक पहुंचने के लिए हमें समझना होगा कि virtualenv वास्तव में कैसे काम करता है।

  • यह PATH वातावरण चर को अद्यतन करता virtualenv से bin निर्देशिका शामिल करने के लिए, ताकि जब आप से python द्विआधारी चलाएँ:

    जब आप एक virtualenv अंदर activate स्क्रिप्ट चलाने के लिए, यह दो बातें करता है वर्चुअलएन्व चलाएगा।

  • यह एक चर VIRTUAL_ENV सेट करता है ताकि सक्रिय स्क्रिप्ट स्वयं सक्रियण का ट्रैक रख सके।

यह सीधे 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 का उपयोग करने वाले लोगों के पास अन्य पूर्व का उपयोग करने का विकल्प होता है।

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