2009-10-07 10 views
21

एक बात मुझे distutils (मुझे लगता है कि he is the evil who does this) से नफरत है यह है कि यह शेबांग लाइन बदलती है। दूसरे शब्दों में, अधिक तर्कसंगत और पर्यावरण के वार्स शास्त्रमेरे शेबैंग को छूएं

#!/usr/bin/env python 

फैसला किया जादुई में

#!/whatever/absolute/path/is/my/python 

यह grok साथ भी देखा जाता है परिवर्तित हो जाता है: मैं एक virtualenv में grokproject इस्तेमाल किया अपने प्रोजेक्ट शुरू करने के लिए है, लेकिन अब मैं विकास निर्देशिका को और आसपास नहीं ले जा सकता, क्योंकि यह शेबांग निर्देश में पूर्ण पथ डालता है।

कारण है कि मैं पूछता हूँ इस दुगना

  • है मैं इसे चारों ओर ले जाना चाहते हैं, क्योंकि मैं एक निर्देशिका (प्रयोगों) में विकासशील और अब मैं यह एक उचित मार्ग में ले जाना चाहते हैं शुरू कर दिया है, लेकिन मैं नहीं कर सकता कर दो। इसलिए मैंने एक नया वर्चुअलनव और ग्रोकप्रोजेक्ट बनाया और मेरी फाइलों की प्रतिलिपि बनाई। इससे इस मुद्दे को हल किया जाता है, लेकिन असंतोषजनक समाधान के लिए मेरी जिज्ञासा छोड़ देता है। विशेष रूप से, यदि वर्चुअलनेव पायथन दुभाषिया का संदर्भ सापेक्ष था, तो समस्या पहले स्थान पर मौजूद नहीं होती। आप वर्चुअलएन्व के लेआउट को जानते हैं, और आप वर्चुअलनव पायथन को आसानी से देख सकते हैं।
  • दूसरा कारण यह है कि मैं वर्चुअलएन्व को किसी अन्य कंप्यूटर पर स्कैन करने और बिना किसी परेशानी के इसे चलाने में सक्षम होना चाहता हूं। यदि आपके पास हार्डकोडेड पथ हैं तो यह संभव नहीं है।
+3

@Lennart: क्योंकि मैं नहीं बल्कि कष्टप्रद मेरे सभी स्थापित सामान एक विशिष्ट पथ के खिलाफ एक बहुत मजबूत और दर्दनाक निर्भरता है कि लगता है मेरे फाइल सिस्टम का, विशेष रूप से जब कोई विकल्प मौजूद होता है। –

+0

तो आप इसे चारों ओर ले जाना चाहते हैं, केवल इसलिए कि यह स्पष्ट नहीं है कि कैसे? :-) Oooookay ... –

+0

@Lennart: प्रश्न में जोड़ा गया। –

उत्तर

13

बेशक आप विकास निर्देशिका को चारों ओर स्थानांतरित कर सकते हैं। Distutils पाइथन के पथ बदलता है कि जब आप इसे चलाने के साथ चलाना चाहिए। जब आप बिल्डआउट चलाते हैं तो यह ग्रोक रन में होता है। बूटस्ट्रैप और बिल्डआउट को ले जाएं और फिर से चलाएं। किया हुआ!

Distutils पाइथन के पथ को बदलता है जिसका उपयोग आप आसवन चलाने के लिए करते हैं। यदि ऐसा नहीं होता है, तो आप एक पायथन संस्करण में लाइब्रेरी स्थापित करना समाप्त कर सकते हैं, लेकिन जब आप स्क्रिप्ट चलाने की कोशिश करते हैं तो यह असफल हो जाता है, क्योंकि यह लाइब्रेरी नहीं होने वाले दूसरे पायथन संस्करण के साथ चलता है।

यह पागलपन नहीं है, वास्तव में यह करने का एकमात्र तरीका है।

अद्यतन: क्या आप जानते हैं कि आप क्या कर रहे हैं, तो आप ऐसा कर सकते हैं:

/path/to/install/python setup.py build -e "/the/path/you/want/python" install 

सुनिश्चित करें कि आप का निर्माण निर्देशिका हालांकि पहले साफ करें। :)

+0

आपके पास एक बिंदु है। हालांकि, मुझे लगता है कि अगर आप वास्तव में चाहते हैं, तो इस परिवर्तन को छोड़ने की संभावना होनी चाहिए। –

+1

यह, यदि आप इसे स्क्रिप्ट के बजाय डेटा फ़ाइलों के रूप में स्थापित कर सकते हैं। लेकिन जैसे ही आप इसे एक सिस्टम पर स्थापित करेंगे जैसे यह आपके जैसे बिल्कुल दिखाई नहीं देगा। –

2

मैं आपकी समस्या का कोई समाधान नहीं है, लेकिन मैं distutils की वर्तमान व्यवहार के लिए कुछ तर्क क्यों दिखाई देता है।

#!/usr/bin/env python सिस्टम के डिफ़ॉल्ट पायथन संस्करण को निष्पादित करता है। यह तब तक ठीक है जब तक आपका कोड उस संस्करण के साथ संगत है। जब डिफ़ॉल्ट संस्करण अद्यतन किया जाता है (2.5 से 3 तक, कहें) आपका कोड या अन्य पायथन कोड जो संदर्भ /usr/bin/env काम करना बंद कर सकता है, भले ही पुराना पायथन संस्करण अभी भी स्थापित हो। इसी कारण से उचित पाइथन दुभाषिया के पथ को "हार्डकोड" करना समझ में आता है।

संपादित करें: आप यह कहते हुए सही हैं कि python2.4 निर्दिष्ट करें या इसी तरह से इस समस्या को हल करें।

संपादित करें 2: चीजें स्पष्ट कट नहीं हैं जब एक ही पायथन संस्करण के कई इंस्टॉलेशन मौजूद हैं, Ned Deily नीचे टिप्पणियों में बताए गए हैं।

+0

आप python24 का उपयोग कर सकते हैं। तथ्य यह है कि जब आपके पास वर्चुअलएन्व होता है, तो आप इसे तय करने में सक्षम होना चाहते हैं यदि आप ऐसा करते हैं। एक सापेक्ष पथ बेहतर होगा, जब आप वर्चुअलएन्व बनाते हैं, तब सबकुछ उस डीआईआर में निहित होता है, और सब कुछ रिश्तेदार को संदर्भित किया जा सकता है। –

+0

मुझे distutils के साथ कोई अनुभव नहीं है। आपका प्रश्न '#!/Usr/bin/env python2.4' के बजाय' #!/Usr/bin/env python' उद्धृत करता है। आपने इनमें से किस कोड को अपने कोड में निर्दिष्ट किया था? क्या संस्करण संख्या निर्दिष्ट होने पर distutils भी पुनर्लेखन प्रदर्शन करता है? – Stephan202

+0

कुछ प्रणालियों पर पाइथन स्थापित * समान * संस्करण के एक से अधिक उदाहरण होने के लिए असामान्य नहीं है; इस प्रणाली पर, मेरे पास python2.5 के 3 संस्करण होते हैं और यह वर्चुअलएन्ग की गणना नहीं कर रहा है। चूंकि लेनार्ट बताते हैं, स्क्रिप्ट एक विशेष दुभाषिया स्थापना के लिए स्थापित और बंधे हैं। यही कारण है कि, सबसे सामान्य मामले में, रिश्तेदार शेबैंग पथ सही व्यवहार की गारंटी नहीं देते हैं। –

8

Distutils स्वचालित रूप से Python बाइनरी के स्थान के साथ शेबैंग को प्रतिस्थापित करेगा जिसका उपयोग setup.py को निष्पादित करने के लिए किया गया था।

विकल्प 1:: इस व्यवहार को ओवरराइड करने के लिए आपके पास दो विकल्प मैन्युअल

आप ध्वज प्रदान कर सकते हैं --executable =/path// मेरी/अजगर setup.py करने के लिए। तर्क स्वीकार किए जाते हैं।

उदाहरण:

% python setup.py build --executable=/opt/local/bin/python -d 

विकल्प 2: स्वचालित रूप से

आपका दूसरा विकल्प setup.cfg के लिए एक लाइन को जोड़ने के लिए है। अगर आप setup.cfg का उपयोग नहीं कर रहे हैं, तो इसे setup.py के समान निर्देशिका में बनाएं। Setup.py इसे स्टार्टअप पर ढूंढता है। यहां निर्दिष्ट कोई भी विकल्प कमांड लाइन पर झंडे के साथ अभी भी ओवरराइड किया जा सकता है।

% cat setup.cfg 
[build] 
executable = /opt/local/bin/python -d 
+0

इसके लिए धन्यवाद। यह कमाल का है। मुझे यह कहीं भी दस्तावेज नहीं मिल रहा है। कुछ दस्तावेज लिंक पोस्ट करने की देखभाल? –

+0

'पायथन setup.py build --help';) – jathanism

+0

क्या 'python setup.py develop' के लिए कुछ समान है? मेरे वर्चुअलएन्व सेटअप के परिणामस्वरूप बहुत लंबे शेबैंग पथ होते हैं जो उन्हें चलाने की कोशिश करते समय 'खराब दुभाषिया' त्रुटियों का कारण बनते हैं। मैंने स्क्रिप्ट के भीतर से 'sys.executable ='/usr/bin/env python'' की कोशिश की, लेकिन अंतरिक्ष को शेबैंग में उद्धरण डालने के लिए distutils का कारण बनता है, जो चीजों को एक अलग तरीके से तोड़ देता है। –

1

distutils के नवीनतम संस्करण में से एक में, वहाँ एक झंडा --no-autoreq कि मेरे लिए काम किया है है:

--no-autoreq   do not automatically calculate dependencies 

मेरे मामले में, मैं आरपीएम निर्माण कर रहा है 2.4 और 2.6 दोनों इंस्टॉलेशन वाले सर्वर में python2.4 निष्पादन योग्य फ़ाइलों के साथ फ़ाइलें। bdist सिर्फ shebangs छोड़ दिया के रूप में वे थे चलाने के बाद,:, आप उपयोग कर सकते हैं समाधान https://stackoverflow.com/a/7423994/722997 में विस्तार से बताया

python setup.py bdist_rpm --no-autoreq 

मामले कि आप कल्पना फ़ाइलों संभाल रहे हैं में, जोड़ने:

AutoReq: no 
1

एक ही मुद्दा था। डिफ़ॉल्ट रूप से स्पर्श को पूरी तरह से रोकने के लिए एक रास्ता खोजने का प्रयास किया। यहां समाधान है। अनिवार्य रूप से हम डिफ़ॉल्ट स्क्रिप्ट प्रति दिनचर्या (build_scripts) को ओवरराइड करते हैं।

setup.py में जोड़ने

from distutils.command.build_scripts import build_scripts 

# don't touch my shebang 
class BSCommand (build_scripts): 
    def run(self): 
     """ 
     Copy, chmod each script listed in 'self.scripts' 
     essentially this is the stripped 
     distutils.command.build_scripts.copy_scripts() 
     routine 
     """ 
     from stat import ST_MODE 
     from distutils.dep_util import newer 
     from distutils import log 

     self.mkpath(self.build_dir) 
     outfiles = [] 
     for script in self.scripts: 
      outfile = os.path.join(self.build_dir, os.path.basename(script)) 
      outfiles.append(outfile) 

      if not self.force and not newer(script, outfile): 
       log.debug("not copying %s (up-to-date)", script) 
       continue 

      log.info("copying and NOT adjusting %s -> %s", script, 
         self.build_dir) 
      self.copy_file(script, outfile) 

     if os.name == 'posix': 
      for file in outfiles: 
       if self.dry_run: 
        log.info("changing mode of %s", file) 
       else: 
        oldmode = os.stat(file)[ST_MODE] & 0o7777 
        newmode = (oldmode | 0o555) & 0o7777 
        if newmode != oldmode: 
         log.info("changing mode of %s from %o to %o", 
           file, oldmode, newmode) 
         os.chmod(file, newmode) 

setup(name="name", 
     version=version_string, 
     description="desc", 
     ... 
     test_suite='testing', 
     cmdclass={'build_scripts': BSCommand}, 
    ) 

.. Ede/duply.net

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