python == python2 या python == python3? पैकेज कैसे करें, अजगर py2k स्क्रिप्ट वितरित करें?


10

प्रणाली के आधार पर, python== python2या python== python3

पायथन स्क्रिप्ट्स के साथ शुरू होता है:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

अजगर py3k के लिए यह प्रलेखन में प्रदान किया जाता है जो मुझे संस्करण संख्या के साथ उपयोग करना चाहिए / कर सकता है , इसलिए मैं ऐसा करता हूं:

#!/usr/bin/env python3

लेकिन मुझे py2k स्क्रिप्ट के साथ एक समस्या मिली है।

में रहते हुए py2k प्रलेखन यह उपयोग करने के लिए लिखा है: #! /usr/bin/env python,

कुछ * nix-es python py3k पर डिफ़ॉल्ट है, इसलिए python == python3। (उदाहरण के लिए ArchLinux python package , here python package files )।

वितरण करने के लिए पैकेज को कैसे कॉन्फ़िगर करें (कॉन्फ़िगर करें, करें) और / या तैयार करें कि इसे संभाल सकें?

मैं ऐसे सॉफ्टवेयर पैकेज बनाने के बारे में पूछता हूं जो उपयोगकर्ताओं द्वारा आसानी से चलाए जा सकते हैं (बिना उनके वातावरण को संशोधित किए)

क्या मैं अजगर py2k स्क्रिप्ट के लिए अजगर की स्क्रिप्ट के समान ट्रिक कर सकता हूं और इसे इस प्रकार सेट कर सकता हूं #!/usr/bin/env python2:? क्या मुझे यकीन है कि प्रत्येक अजगर py2k वितरण में python2फ़ाइल शामिल है, इसलिए #!/usr/bin/env python2काम करेगा?

यदि हाँ, तो यह मानक के रूप में प्रस्तावित क्यों नहीं है, उदाहरण के लिए अजगर py2k प्रलेखन में ?


4
जहाँ तक मुझे पता है आप हमेशा python2इसे चलाने के लिए उपयोग कर सकते हैं (यदि यह स्थापित है), और इसके साथ आप संस्करण की जाँच कर सकते हैं python -V। यदि आप चाहते हैं कि pythonयह 2 या 3 होगा, तो आपको rm /usr/bin/pythonअपने डेसिडर पायथन संस्करण जैसे अंक बनाने वाले सिमलिंक बनाने चाहिए ln -s /usr/bin/python2.5 /usr/bin/python
हनन एन।

मुझे सुनिश्चित करने के लिए धन्यवाद python2। मुझे आश्चर्य है कि py2k और py3k होने पर इसका उपयोग करने के लिए मानक क्यों नहीं है और डिफ़ॉल्ट pythonअलग हो सकता है। हटाने के बारे में आपकी सलाह के बारे में क्या है - यह इस उदाहरण के लिए उचित नहीं है, क्योंकि मैं पैकेजिंग के बारे में पूछता हूं। मैं ऐसा पैकेज बनाना चाहूंगा जो विभिन्न कॉन्फ़िगरेशन / सिस्टम में चल सके। पर्यावरण को संशोधित करने का कोई तरीका नहीं। जाँच के बारे में क्या - यह शेबंग पर लागू नहीं होता है - जहाँ तक मुझे पता है।
ग्रेज़गोरज़ वियरज़ोवेकी

मेरा मानना ​​है कि @Hanan N. आपको यह बताने की कोशिश कर रहा है कि यदि आप Python 2.x कोड लिख रहे हैं, तो #!...python2अपने कार्यक्रमों में उपयोग करें और यदि आप Python 3.x का उपयोग कर रहे हैं, तो उपयोग करें #!...python3। यदि आप जानते हैं कि यह केवल एक विशेष रिलीज पर काम करेगा, तो सही लिंक होने के लिए ऑपरेटिंग सिस्टम पर भरोसा न करें। मैं उन प्रणालियों के साथ काम करता हूं जिनमें अभी भी Python 1.5.2 स्थापित है /usr/bin/python- मैं या तो पुराने Python रिलीज़ को संभालने या उपयोग करने के लिए कोड लिखता हूं python2
18

2
@ मेरे पास python2मेरे सिस्टम पर एक निष्पादन योग्य नहीं है (डेबियन निचोड़)। pythonके लिए एक सहानुभूति है python2.6, और इसके python3लिए एक सहानुभूति है python3.1, लेकिन कोई भी नहीं है python2
गाइल्स का SO- बुराई पर रोक '23

जवाबों:


3

एक स्क्रिप्ट अपने पायथन संस्करण की जांच कर सकती है और अगर वह पायथन 3 है, तो पायथन का उपयोग करके खुद को फिर से शुरू करें। स्क्रिप्ट के प्रमुख के पास निम्नलिखित जोड़ें:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

यह सिस्टम के whichकमांड का उपयोग python2पर्यावरण की स्थिति का पता लगाने के लिए करता है PATH। इसके बाद यह अपने आप को उस से छुटकारा दिलाता है (या इसे खोजने में असमर्थ होने पर गर्भपात करता है)।

ध्यान दें कि स्क्रिप्ट को पायथन 3 में शुरू करने के लिए वैध पायथन 3 सिंटैक्स होना आवश्यक है।

इसके अलावा, किसी भी आउटपुट को execvकॉल से पहले फ्लश किया जाना चाहिए या यह खो जाएगा। उदाहरण के लिए, sys.stdout.flush()कॉल करने से ठीक पहले, execvकिसी भी printस्टेटमेंट को फ्लश कर देगा ।


1

पुराने संस्करणों पर, pythonइसके बजाय बस हो सकता है python2। अपनी शीबांग लाइन को साफ करने के लिए, आप एक लिंक बना सकते हैं python2 -> pythonताकि आप उपयोग कर सकें #!/usr/bin/env python2


हालाँकि, यह बताई गई समस्या को हल नहीं करता है। क्योंकि सवाल यह है कि आपकी स्क्रिप्ट को पर्याप्त पोर्टेबल कैसे बनाया जा सकता है, इसलिए यह सभी उल्लेखित वातावरण ("अजगर" "पायथन 2" आदि) के साथ चल सकता है
ग्रेज़गोरज़ वियरज़ोवेकी

1

मुझे लगता है कि "मानक" को https://www.python.org/dev/peps/pep-0394/ में परिभाषित किया गया है

यह PEP यह सुनिश्चित करने के लिए एक कन्वेंशन प्रदान करता है कि पायथन स्क्रिप्ट्स के डिफ़ॉल्ट संस्करण की परवाह किए बिना (अर्थात python कमांड द्वारा लागू किया गया संस्करण), पायथन स्क्रिप्ट्स * nix सिस्टम के पार पोर्टेबल बनी रह सकती हैं।

  • python2 Python 2.x के कुछ संस्करण को संदर्भित करेगा।
  • python3 Python 3.x के कुछ संस्करण को संदर्भित करेगा।
  • कुछ समय के लिए, सभी वितरणों को यह सुनिश्चित करना चाहिए कि अजगर python2 के समान लक्ष्य को संदर्भित करता है।
  • हालाँकि, अंतिम उपयोगकर्ताओं को पता होना चाहिए कि अजगर कम से कम आर्क लिनक्स पर python3 को संदर्भित करता है (जो कि इस पीईपी के निर्माण को प्रेरित करता है), इसलिए अजगर को केवल उन लिपियों के लिए शेब लाइन में उपयोग किया जाना चाहिए जो दोनों पायथन 2 के साथ संगत हैं। और 3।
  • पायथन के डिफ़ॉल्ट संस्करण में एक अंतिम बदलाव के लिए तैयारी में, पायथन 2 केवल लिपियों को या तो पायथन 3 के साथ संगत होने के लिए अद्यतन किया जाना चाहिए या फिर शेबांग लाइन में पायथन 2 का उपयोग करना चाहिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.