2017-02-15 19 views
7

हम असमर्थित पायथन संस्करण का उपयोग करते समय पैकेज को स्थापित करने और प्रयास करने से रोकने के लिए setup.py फ़ाइल में क्या डाल सकते हैं?पुराने पायथन संस्करणों पर पैकेज को स्थापित करने से रोकें

उदाहरण magicstack के लिए निधि वर्गीकारक के साथ सूचीबद्ध एक परियोजना है:

Programming Language :: Python :: 3 :: Only 

तो मैं उम्मीद करता है, तो pip --version निम्नलिखित व्यवहार 2.7 अजगर से जुड़ा हुआ है:

$ pip install magicstack 
Collecting magicstack 
    Could not find a version that satisfies the requirement magicstack (from versions:) 
No matching distribution found for magicstack 

लेकिन वास्तविक व्यवहार करता है पीआईपी एक रिलीज इकट्ठा करता है, इसे डाउनलोड करता है, इसे स्थापित करने का प्रयास करता है, और विफल रहता है। उदाहरण के लिए अन्य Python3-only रिलीज, curio हैं, जो वास्तव में ठीक इंस्टॉल करते हैं - क्योंकि setup.py ने कुछ भी नहीं किया है जो कि पाइथन 3 विशिष्ट - केवल आयात समय पर असफल होने पर ही कुछ पायथन 3 सिंटैक्स का उपयोग किया जाता है। और मुझे यकीन है कि ऐसे पैकेज हैं जो ठीक इंस्टॉल करते हैं, ठीक आयात करते हैं, और शायद रनटाइम पर ही असफल हो सकते हैं!

आपके समर्थित पायथन संस्करणों को निर्दिष्ट करने के लिए सही तरीका क्या है कि पीआईपी सम्मान करेगी? मुझे एक वर्कअराउंड मिला है, जिसमें केवल एक व्हील फ़ाइल अपलोड करना शामिल है, और .tar.gz वितरण अपलोड करने से इंकार कर रहा है, लेकिन मुझे सही फ़िक्स जानने में दिलचस्पी होगी।


संपादित करें: कैसे पिप नहीं पता है पहिया वितरण करता है, तो अजगर/ओएस/वास्तुकला मिलान नहीं है डाउनलोड करने के लिए? क्या यह सिर्फ .whl filename convention का उपयोग करता है या दृश्यों के पीछे होने वाली तुलना में कुछ और परिष्कृत है? क्या हम किसी भी तरह से स्रोत वितरण के लिए मेटाडेटा दे सकते हैं ताकि पाइप को .tar.gz अपलोड के साथ सही काम कर सकें?

+0

मुझे नहीं पता कि यह _right_ उत्तर है ... लेकिन अगर 'जादूस्टैक' केवल python3 है क्योंकि 'setup.py' python2.x पर विफल रहता है, तो ऐसा लगता है कि यह काम करने का एक संभावित तरीका है अनुचित पायथन संस्करणों पर असफल होने के लिए अपने 'setup.py' को मजबूर करें ... – mgilson

+0

हैकी। यदि पाइप असमर्थित पायथन दुभाषिया से जुड़ा हुआ है, तो मैं नहीं चाहता कि पैकेज एकत्र या डाउनलोड किया गया हो, अकेले ही 'setup.py' को निष्पादित करके एक इंस्टॉलेशन प्रयास करें। – wim

+0

Google कुछ [पिछला] (http://stackoverflow.com/questions/13924931/setup-py-restrict-the-allowable-version-of-the-python-interpreter) [प्रश्न] (http: // stackoverflow) .com/प्रश्न/13385337/वितरण-distutils-निर्दिष्ट-पायथन संस्करण) उत्तर के साथ आपके 'setup.py' पाइथन संस्करण की जांच करें। – user2357112

उत्तर

3

ऐसा करने का एक सही तरीका है, लेकिन दुर्भाग्य से पीआईपी ने संस्करण 9.0.0 (2016-11-02 को जारी) में इसका समर्थन करना शुरू कर दिया है, और इसलिए पीपी के पुराने संस्करण वाले उपयोगकर्ता पैकेज को डाउनलोड करना जारी रखेंगे चाहे वे पाइथन संस्करण के लिए क्या हैं।

अपने setup.py फ़ाइल में setup() एक python_requires तर्क यह है कि एक PEP 440version specifier के रूप में अपने पैकेज के समर्थित अजगर संस्करणों को सूचीबद्ध करता है गुजरती हैं। उदाहरण के लिए, यदि आपका पैकेज केवल पायथन 3+ के लिए है, तो लिखें:

setup(
    ... 
    python_requires='>=3', 
    ... 
) 

यदि आपका पैकेज पायथन 3 के लिए है।3 और ऊपर, लेकिन आप अभी तक 4 समर्थन पायथन के लिए प्रतिबद्ध करने के लिए तैयार नहीं कर रहे हैं, लिखें:

setup(
    ... 
    python_requires='~=3.3', 
    ... 
) 

अपने पैकेज अजगर 2.6, 2.7 के लिए है, और अजगर 3 के सभी संस्करणों 3.3 के साथ शुरू, लिखें:

setup(
    ... 
    python_requires='>=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4', 
    ... 
) 

और इसी तरह।

एक बार ऐसा करने के बाद, python_requires संसाधित होने के लिए आपको सेटअपtools के अपने संस्करण को कम से कम 24.2.0 में अपग्रेड करना होगा; पहले के संस्करण सिर्फ एक चेतावनी के साथ अनदेखा करेंगे। बाद में आपके सभी प्रोजेक्ट के स्किड्स और पहियों का निर्माण प्रासंगिक मेटाडेटा होगा जो पीपीपीआई को पाइप को बताएगा कि वे पाइथन संस्करण क्या हैं।

+0

हाय, अद्यतन के लिए धन्यवाद। मैंने आपके समाधान की कोशिश की, लेकिन यह उम्मीद के अनुसार काम नहीं करता है। मैंने v34.3.2 पर setuptools को अद्यतन किया है, और 'python_requires' kwarg का उपयोग करके नए वितरण अपलोड किए हैं। पाइथन 3.6 पर पीआईपी संस्करण 9.0.1 के साथ, व्यवहार ** सही ** है (पीआईपी वितरण को डाउनलोड/निष्पादित करने से इनकार करता है, और आवश्यक/वास्तविक पायथन संस्करणों को प्रिंट करता है)। हालांकि पाइथन 2.7 पर पाइप संस्करण 9.0.1 का उपयोग करना, यह गलत है - वितरण डाउनलोड हो गया है और 'setup.py' निष्पादित किया गया है। ऐसा लगता है कि प्रासंगिक मेटाडेटा है (क्योंकि यह pip3 के लिए काम करता है) लेकिन इसे pip2 द्वारा अनदेखा किया जाता है। क्या मैं कुछ भूल रहा हूँ? – wim

+0

@wim: आप 'python_requires' के लिए किस संस्करण विनिर्देशक का उपयोग करते थे? – jwodder

+0

मैंने मेटाडेटा पर प्रतिबंध लागू करने के लिए 'python_requires> = '3.6.1'' का उपयोग किया, और फिर 3.6.0 और 2.7.5 में वर्चुअल वातावरण का उपयोग करके पाइप 9.0.1 का परीक्षण किया। – wim

1

magicstack पीपीआई पर वितरण टूट गया है। यह असफल रहा है क्योंकि स्रोत वितरण में स्रोत वितरण के लिए स्रोत वितरण में magicstack पैकेज नहीं है।

जब तक pypi एक स्रोत वितरण (जैसे .tar.gz, .zip) शामिल हैं, पिप डाउनलोड करेगा कि यह अजगर/ओएस/वास्तुकला के अपने संस्करण के लिए एक मिलान द्विआधारी वितरण (जैसे .egg, .whl) नहीं मिल सकता है।

आपके विकल्प केवल pypi (अधिमानतः wheels) पर बाइनरी वितरण अपलोड करना है, हालांकि मुझे यह भी नहीं पता कि बाइनरी-केवल pypi पैकेजों की अनुमति है या नहीं। दूसरा विकल्प संगत संस्करणों के लिए setup.py में sys.version को जांचना और अन्यथा अपवाद उठाना है।

+0

बाइनरी केवल वितरण को अपलोड करने की अनुमति है, मैंने वास्तव में अपने वर्तमान कार्यवाही के रूप में इस प्रश्न में इसका उल्लेख किया है। एक पैकेज के उदाहरण के लिए [toga-curses] (https://pypi.python.org/pypi/toga-curses/) देखें जो pip3 के साथ स्थापित होगा लेकिन pip2 द्वारा भी नहीं देखा जाएगा। – wim

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