2009-02-09 9 views
13

पृष्ठभूमि: मेरे पास एक छोटा पायथन एप्लिकेशन है जो डेवलपर्स के लिए जीवन को हमारी कंपनी में सॉफ़्टवेयर जारी करने के लिए थोड़ा आसान बनाता है। मैं py2exe का उपयोग कर विंडोज के लिए एक निष्पादन योग्य बनाता हूं। आवेदन के साथ-साथ बाइनरी को सबवर्जन में चेक किया जाता है। एसवीएन से निर्देशिका की जांच करने वाले लोगों द्वारा वितरण होता है। डेवलपर्स के लिए इस उपकरण के स्रोत पर हैक करने और फिर द्विआधारी निर्माण करने के लिए बिना इसे चलाने के हैं: कार्यक्रम के बारे में 6 अलग अजगर पुस्तकालय निर्भरता (जैसे ElementTree, मैको)लाइब्रेरी के साथ एक पाइथन अनुप्रयोग को स्रोत के रूप में कैसे आगे निर्भरता के साथ तैनात करने के लिए?

स्थिति है। वर्तमान में इसका मतलब है कि उन्हें एक पायथन 2.6 दुभाषिया (जो ठीक है) की आवश्यकता है और 6 पुस्तकालयों को आसानी से easy_install का उपयोग करके स्थापित किया गया है।

समस्या

  • यह एक सार्वजनिक, शास्त्रीय खुला स्रोत वातावरण नहीं है: मैं एक कंपनी के नेटवर्क के अंदर हूँ, उपकरण "दीवारों उद्यान" को कभी नहीं छोड़ेंगे और हम करने के लिए गंभीरता से असुविधाजनक अवरोध होते हैं बाहरी इंटरनेट (एनटीएलएम प्रमाणीकरण प्रॉक्सी और/या सीधे इंटरनेट एक्सेस के बिना मशीनों) को प्राप्त करना।
  • मैं चाहता हूं कि इस टूल पर न्यूनतम होने के बाधाएं बाधाएं हों: किसी को भी सही संस्करण में सही निर्भरता की तलाश नहीं करनी चाहिए, उन्हें जितना संभव हो सके छोटे सेटअप को निष्पादित करना होगा। बेहतर रूप से पूर्वापेक्षाएँ में पाइथन इंस्टॉलेशन होगा और केवल सबवर्सन से प्रोग्राम की जांच होगी।

किस्सा: अधिक आत्म निहित प्रक्रिया को आसान इसे दोहराने के लिए है। मैंने अपनी मशीन को एक नए के लिए बाहर कर दिया था और निर्भरताओं को उलटा करने के लिए अप्रिय प्रक्रिया के माध्यम से, distutils को पुनर्स्थापित करने, पुस्तकालयों को ऑनलाइन शिकार और उन्हें स्थापित करने के लिए अप्रिय प्रक्रिया (ऊपर कॉर्पोरेट इंटरनेट प्रतिबंध देखें) के माध्यम से चला गया।

उत्तर

8

मैं कभी-कभी नीचे बताए गए दृष्टिकोण का उपयोग करता हूं, उसी कारण से @ बोरीस कहता है: मैं पसंद करूंगा कि कुछ कोड का उपयोग एएसएन चेकआउट/अपडेट - बी) के रूप में आसान है।

लेकिन रिकार्ड के लिए:

  • मैं उपयोग virtualenv/easy_install समय के सबसे अधिक।
  • मैं

वैसे भी @Ali एक S.Lott द्वारा और @ critisisms को कुछ हद तक सहमत हैं, दृष्टिकोण का उपयोग मैं sys.path को संशोधित करने पर निर्भर करता है, और इस तरह काम करता है:

  • आपके कंप्यूटर का उपयोग करने वाले सभी कंप्यूटरों पर पाइथन और सेटअपटोल (अंडों से लोडिंग कोड सक्षम करने के लिए) की आवश्यकता है।
  • अपने निर्देशिका संरचना इस व्यवस्थित करें:
 
from scriptcustomize import apply_pth_files 
apply_pth_files(__file__) 
  • scriptcustomize जोड़ें:
 
project/ 
    *.py 
    scriptcustomize.py 
    file.pth 

    thirdparty/ 
     eggs/ 
      mako-vNNN.egg 
      ... .egg 
     code/ 
      elementtree\ 
       *.py 
      ... 
  • अपने उच्च-स्तरीय स्क्रिप्ट (रों) में शीर्ष पर यह कोड शामिल आपके प्रोजेक्ट फ़ोल्डर में .py:
 
import os 
from glob import glob 
import fileinput 
import sys 

def apply_pth_files(scriptfilename, at_beginning=False): 
    """At the top of your script: 
    from scriptcustomize import apply_pth_files 
    apply_pth_files(__file__) 

    """ 
    directory = os.path.dirname(scriptfilename) 
    files = glob(os.path.join(directory, '*.pth')) 
    if not files: 
     return 
    for line in fileinput.input(files): 
     line = line.strip() 
     if line and line[0] != '#': 
      path = os.path.join(directory, line) 
      if at_beginning: 
       sys.path.insert(0, path) 
      else: 
       sys.path.append(path) 
  • जोड़े एक या अधिक * .pth फ़ाइल (रों) अपनी परियोजना फ़ोल्डर में। प्रत्येक पंक्ति पर, संकुल के साथ एक निर्देशिका का संदर्भ दें।उदाहरण के लिए:
 
# contents of *.pth file 
thirdparty/code 
thirdparty/eggs/mako-vNNN.egg 
  • मैं "तरह-की" इस दृष्टिकोण की तरह। मुझे क्या पसंद है: यह समान है कि * .pth फ़ाइलें कैसे काम करती हैं, लेकिन आपके संपूर्ण साइट-पैकेज के बजाय अलग-अलग कार्यक्रमों के लिए। मुझे क्या पसंद नहीं है: शीर्ष-स्तरीय स्क्रिप्ट की शुरुआत में दो लाइनों को जोड़ना है।
  • फिर से: मैं वर्चुअलनेव का अधिकांश समय उपयोग करता हूं। लेकिन मैं उन परियोजनाओं के लिए वर्चुअलएन्व का उपयोग करता हूं जहां मुझे तैनाती परिदृश्य का कड़े नियंत्रण है। ऐसे मामलों में जहां मेरे पास कड़े नियंत्रण नहीं हैं, मैं ऊपर वर्णित दृष्टिकोण का उपयोग करता हूं। यह एक ज़िप के रूप में एक परियोजना को पैकेज करना वास्तव में आसान बनाता है और अंतिम उपयोगकर्ता इसे "इंस्टॉल" करता है (अनजिप करके)।
+0

दिलचस्प, यह काफी काम की तरह दिखता है लेकिन ऐसा लगता है कि अंतिम परिणाम वह हो सकता है जो मैं ढूंढ रहा हूं। मैं इसे आज़माउंगा और रिपोर्ट करूंगा। –

+1

ठीक है, यह कमाल है। आपकी स्क्रिप्ट और दृष्टिकोण के साथ मैं मूल रूप से वही हूं जो मैं खोज रहा था और केवल बूटस्ट्रैपिंग आवश्यकताएं पाइथन और सबवर्जन चेकआउट हैं। और मेरे पास उन लोगों के लिए बहुत साफ गिरावट है जो अपने स्थानीय साइट-पैकेज का उपयोग करना चाहते हैं। –

+0

.pth फ़ाइलों के साथ क्या गलत है? –

9

बस virtualenv का उपयोग करें - यह पृथक पायथन वातावरण बनाने के लिए एक उपकरण है। आप एक सेट-अप स्क्रिप्ट बना सकते हैं और यदि आप चाहें तो पूरे समूह को वितरित कर सकते हैं।

+0

दिलचस्प लग रहा है, मैं इसे आज़माउंगा और अगर यह काम करता है तो आप लोगों को जवाब को स्वीकार/स्वीकार कर सकते हैं। –

+0

अब रेपो से चेकआउट नहीं कर सकता है लेकिन दस्तावेज़ यह इंगित करते हैं कि "स्थानांतरित करने योग्य" वर्चुअलएन्विन सेटअप विंडोज के लिए समर्थित नहीं हैं। यह _seems_ जैसा कि मुझे अपने उपयोग के मामले (सबवर्जन बूटस्ट्रैप) के लिए इन relocatables की आवश्यकता है। –

+0

वर्चुअलएन्व का "स्थानांतरित करने योग्य" तर्क इस तरह के उपयोग के लिए विश्वसनीय नहीं है। लेकिन मुझे यह पता चला है, जो ठीक से स्थानांतरित करने की कमियों को दूर करने का प्रयास करता है: https://github.com/fireteam/virtualenv-tools – gaborous

8

"मैं तथ्य यह है कि डेवलपर्स (या मुझे एक साफ नई मशीन पर शुरू) नापसंद इससे पहले कि वे शुरू कर सकते हैं स्थानीय स्तर पर स्थापित करने के लिए पुस्तकालयों होने के distutils हुप्स के माध्यम से कूद करने की है"

क्यों?

क्या - विशेष रूप से - इसमें गलत है?

आपने इसे प्रोजेक्ट बनाने के लिए किया था। आपकी परियोजना इतनी लोकप्रिय है कि दूसरों को भी ऐसा करना है।

मुझे कोई समस्या नहीं दिख रही है। कृपया हल की जाने वाली विशिष्ट समस्याओं के साथ अपना प्रश्न अपडेट करें। ओपन सोर्स वितरित करने के तरीके को नापसंद करना कोई समस्या नहीं है - यह वही तरीका है जो ओपन सोर्स काम करता है।

संपादित। "दीवार वाले बगीचे" से कोई फर्क नहीं पड़ता।

विकल्प 1. आप बीटीडब्लू, एक "इंस्टॉलर" बना सकते हैं जो उनके लिए 6 बार easy_install चलाता है।

विकल्प 2. आप सभी इंस्टॉलर किट को सहेज सकते हैं जो easy_install का उपयोग होता। फिर आप एक स्क्रिप्ट प्रदान कर सकते हैं जो सभी छः के लिए एक अनजिप और python setup.py install करता है।

विकल्प 3. आप अपने site-packages का एक ज़िप संस्करण प्रदान कर सकते हैं। पाइथन स्थापित करने के बाद, वे आपकी साइट-पैकेज निर्देशिका को 'C: \ Python2.5 \ lib \ site-packages`` में अनजिप करते हैं।

विकल्प 4. आप अपने पायथन पर्यावरण के लिए अपनी खुद की एमएसआई इंस्टॉलर किट बना सकते हैं।

विकल्प 5. आप अपना खुद का पीपीआई-सर्वर सर्वर होस्ट कर सकते हैं और एक आसान_install प्रदान कर सकते हैं जो आपके सर्वर को पहले जांचता है।

+0

आप सही हैं कि एक उत्तर हो सकता है: इसके साथ रहें, distutils जाने का रास्ता है । मैं बस सोच रहा था, पाइथन शुरुआत करने वाला कुछ होने के नाते, क्या उस प्रक्रिया को पार करने से बचने का कोई तरीका है। –

+0

मैंने अपनी बाधाओं और धारणाओं से समस्या को वाक्यांशित करने का प्रयास करने के लिए अपना प्रश्न अपडेट किया: मैं "सामान्य" ओपन सोर्स संदर्भ में distutils मॉडल के लिए तर्क को समझता हूं, लेकिन मुझे लगता है कि मैं एक अधिक बाध्य वातावरण में हूं जो दोनों अनुमति देता है और कम बाधाओं से लाभ होगा। –

+0

आगे की जानकारी के लिए धन्यवाद, मैंने वास्तव में स्क्रिप्ट को माना है जो उनके लिए आसान है। हालांकि यह अतिरिक्त easy_install निर्भरता (डाउनलोड, इंस्टॉल) पेश करता है जो कोडेप के दृष्टिकोण का उपयोग करते समय अनावश्यक साबित होता है। –

0

मैं नोस्क्लो और एसएलॉट के उत्तरों से सहमत हूं। (दोनों को +1)

क्या मैं बस जो जोड़ना चाहता हूं उसे जोड़ सकता हूं वास्तव में भयानक विचार है।

यदि आप वास्तव में लोगों को अपने कोड पर हैक करना चाहते हैं, तो उन्हें शामिल पुस्तकालयों की कुछ समझ की आवश्यकता होगी, वे कैसे काम करते हैं, वे कहां से आते हैं, प्रत्येक के लिए प्रलेखन आदि। निश्चित रूप से उन्हें बूटस्ट्रैप प्रदान करें लिपि, लेकिन इससे परे आप इस बिंदु पर मल्ली-कोडिंग करेंगे कि वे अनजान हैं।

फिर कुछ मुद्दे हैं जैसे "क्या उपयोगकर्ता एक अलग संस्करण या पुस्तकालय के कार्यान्वयन को स्थापित करना चाहता है?", यहां एक शानदार उदाहरण एलिमेंटट्री है, क्योंकि इसमें कई कार्यान्वयन हैं।

+1

एर, मैं नहीं देखता कि मेरा प्रश्न _against_ को पुस्तकालयों के दस्तावेज़ों और उनके कहां से आने वाले लिंक तक पहुंचने का तर्क देता है। मैं सिर्फ यथासंभव सरलता और बूटस्ट्रैपिंग की प्रक्रिया बनाना चाहता हूं। –

+0

ठीक है, आप केवल डेवलपर के स्तर को आकर्षित करेंगे जो इसे स्वयं नहीं कर सकता है। –

+1

अगर मैं इसे व्यापक दुनिया में प्रकाशित कर रहा हूं तो शायद, लेकिन हमारे कॉर्पोरेट नेटवर्क पर्यावरण के बारे में मेरी स्पष्टीकरण देखें। स्पष्टीकरण के लिए –

0

मैं सुझाव दे नहीं कर रहा हूँ कि यह एक बहुत अच्छा विचार है, लेकिन आम तौर पर मैं क्या इस तरह की स्थितियों में क्या है कि मैं एक Makefile है, तोड़फोड़, जिसमें नियम बनाने में जाँच की सभी निर्भर पुस्तकालयों लाने और स्थापित करने के लिए है उन्हें। मेकफ़ाइल केवल निर्भर पुस्तकालयों को लागू करने के लिए पर्याप्त स्मार्ट हो सकता है यदि वे मौजूद नहीं हैं, तो यह अपेक्षाकृत तेज़ हो सकता है।

प्रोजेक्ट पर एक नया डेवलपर बस उपversण से बाहर निकलता है और फिर "मेक" टाइप करता है।

यह दृष्टिकोण आपके लिए अच्छा काम कर सकता है, यह देखते हुए कि आपके दर्शक पहले से ही उनके fetch प्रक्रिया के हिस्से के रूप में उपversण चेकआउट का उपयोग करने के विचार के लिए उपयोग किए जाते हैं। साथ ही, इसमें अच्छी संपत्ति है कि आपके बाहरी भरोसेमंद समेत आपके कार्यक्रम के बारे में सभी ज्ञान स्रोत कोड भंडार में कब्जा कर लिया गया है।

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