2025, Nov 01 18:02

ऑफलाइन/एयर‑गैप्ड सर्वर पर pip के बिल्ड आइसोलेशन का समाधान

एयर‑गैप्ड होस्ट पर pip इंस्टॉल में setuptools not found क्यों दिखता है? बिल्ड आइसोलेशन समझें और समाधान पाएं: लोकल व्हील्स (--find-links) या --no-build-isolation से

एयर‑गैप्ड या लॉक‑डाउन सर्वर सुरक्षा के लिए शानदार होते हैं, लेकिन वे Python पैकेजिंग की एक पेचीदगी उजागर कर देते हैं। संभव है कि आपने सभी रनटाइम निर्भरताएँ पहले से इंस्टॉल कर रखी हों, अपना सोर्स डिस्ट्रीब्यूशन डाल दें, और फिर भी pip यह शिकायत करते हुए असफल हो जाए कि उसे setuptools नहीं मिल रहा—हालाँकि Python में उसे import करना काम करता है। इसकी जड़ में कारण बिल्ड आइसोलेशन है, और अच्छी बात यह है कि बिना नेटवर्क एक्सेस खोले इसे साफ-सुथरे तरीके से ठीक किया जा सकता है।

समस्या कैसे दोहराएँ

एक ऑफलाइन मशीन पर, किसी भी रिमोट इंडेक्स को ब्लॉक रखते हुए लोकल sdist को pip से इंस्टॉल करना कुछ ऐसा दिखेगा:

pip3 install --no-deps --no-index acme_pkg-1.0.0.tar.gz

इंस्टॉलेशन इस तरह का संदेश देकर रुक जाता है:

× बिल्ड निर्भरताएँ इंस्टॉल करने के लिए चलाया गया pip subprocess सफल नहीं हुआ।
│ एग्ज़िट कोड: 1
╰─> [आउटपुट की 2 पंक्तियाँ]
    ERROR: setuptools>=57 की आवश्यकता को संतुष्ट करने वाला कोई संस्करण नहीं मिला (उपलब्ध संस्करण: none)
    ERROR: setuptools>=57 के लिए कोई मिलती-जुलती डिस्ट्रीब्यूशन नहीं मिली

लेकिन Python के अंदर setuptools को import करना चलता है और एक अनुरूप संस्करण दिखता है। यही बात उलझन पैदा करती है।

असल में हो क्या रहा है

जब pip किसी पैकेज को सोर्स से बनाता है, तो वह बिल्ड आइसोलेशन का उपयोग करता है। यह एक अस्थायी वर्चुअल एनवायरनमेंट बनाता है, वहाँ घोषित बिल्ड आवश्यकताएँ इंस्टॉल करता है, आपका पैकेज बनाता है, और फिर उस एनवायरनमेंट को हटा देता है। /usr/lib/python3/dist-packages में मौजूद आपके सिस्टम का ग्लोबल setuptools इस आइसोलेटेड चरण में शामिल नहीं होता। आपने --no-index दिया है, इसलिए pip उस अल्पकालिक एनवायरनमेंट के लिए बिल्ड निर्भरताएँ लाने हेतु किसी भी रिपोजिटरी से संपर्क करने से इनकार कर देता है। उस सैंडबॉक्स में इंस्टॉल करने के लिए कोई लोकल व्हील न होने पर, बिल्ड “No matching distribution found for setuptools.” के साथ असफल हो जाता है।

इसे ठीक करने के दो आज़माए हुए तरीके

पहला तरीका यह है कि इंटरनेट से जुड़े मशीन पर बिल्ड टूल्स पहले से डाउनलोड कर लें और ऑफलाइन होस्ट को लोकल रूप से उपलब्ध करा दें। इंटरनेट एक्सेस वाली मशीन पर ज़रूरी व्हील्स डाउनलोड करें:

pip download setuptools wheel

डाउनलोड की गई .whl फ़ाइलें ऑफलाइन सर्वर पर कॉपी करें और pip को उसी लोकल डायरेक्टरी की ओर इशारा करते हुए अपना पैकेज इंस्टॉल करें। इंडेक्स डिसेबल ही रखें ताकि नेटवर्क पर कुछ भी न जाए:

pip install --find-links /srv/wheels/ --no-index acme_pkg

दूसरा तरीका है उस अस्थायी एनवायरनमेंट को पूरी तरह बायपास करना। यदि आपको पता है कि लक्ष्य सिस्टम पर सब कुछ पहले से मौजूद है, तो आप pip को बिल्ड आइसोलेशन न इस्तेमाल करने का निर्देश दे सकते हैं। इससे बिल्ड मौजूदा एनवायरनमेंट के भीतर रहता है और पहले से इंस्टॉल किए गए setuptools का उपयोग करता है:

pip install --no-index --no-build-isolation acme_pkg

यदि इस बात पर ज़रा भी संदेह हो कि आपका pip किस Python इंटरप्रेटर से जुड़ा है, तो असंगतियों से बचने के लिए इंटरप्रेटर के माध्यम से pip चलाएँ:

python -m pip install --no-index --no-build-isolation acme_pkg

ये क्यों मायने रखता है

प्रतिबंधित वातावरणों में, पूर्वानुमेय इंस्टॉलेशन बेहद महत्वपूर्ण होते हैं। कनेक्टेड सिस्टम्स के लिए बिल्ड आइसोलेशन समझदारी भरा डिफ़ॉल्ट है, लेकिन ऑफलाइन स्थिति में, यदि आप बिल्ड निर्भरताएँ पहले से उपलब्ध नहीं कराते, तो वही जाल बन जाता है। यह समझना कि pip एक अल्पकालिक एनवायरनमेंट के भीतर बिल्ड करता है, बताता है कि import सफल क्यों होता है जबकि इंस्टॉलर निर्भरता गायब बताता है। जैसे ही आप --find-links के जरिए लोकल व्हील्स उपलब्ध करा देते हैं या बिल्ड आइसोलेशन बंद कर देते हैं, वर्कफ़्लो फिर से अनुमानित हो जाता है।

निष्कर्ष

एयर‑गैप्ड होस्ट्स पर, बिल्ड के लिए तैयारी रखें। या तो setuptools और wheel जैसे ज़रूरी बिल्ड व्हील्स को किसी कनेक्टेड मशीन पर मिरर करें और --find-links तथा --no-index के साथ pip को उसी स्टैश की ओर निर्देशित करें, या जब आपके नियंत्रण में एनवायरनमेंट हो और आवश्यक टूलिंग पहले से मौजूद हो, तो बिल्ड आइसोलेशन डिसेबल कर दें। इंटरप्रेटर से जुड़ी किसी भी अस्पष्टता को दूर करने के लिए, सभी इंस्टॉलेशन python -m pip के जरिए चलाएँ। इन समायोजनों के साथ, लोकल .tar.gz से अपना पैकेज इंस्टॉल करना नेटवर्क नीति से समझौता किए बिना सुचारू रूप से हो जाता है।

यह लेख StackOverflow के प्रश्न (द्वारा: Bill Shubert) और phd के उत्तर पर आधारित है।