2011-11-09 14 views
12

को देखते हुए निम्नलिखित (प्रदर्शन) परियोजना लेआउट के साथ विभिन्न प्रकार के वितरण बनाएँ:setup.py

MyProject/ 
    README 
    LICENSE 
    setup.py 
    myproject/ 
     ... # packages 
    extrastuff/ 
     ... # some extra data 

कैसे (और जहां) मैं अलग वितरण प्रकार की घोषणा करते हैं?

  1. एकमात्र स्रोत युक्त

  2. एक सूत्र और (extrastuff)

आदर्श रूप में के तहत सभी डेटा फ़ाइलों से युक्त वितरण एक वितरण, मैं कैसे करते हैं: विशेष रूप से मैं इन दो विकल्पों की जरूरत है ऊपरी दो विन्यास की घोषणा करें जबकि दूसरा एक पहले पर निर्भर करता है?

+1

अलग-अलग 'setup.py' फ़ाइलों को क्यों नहीं बनाते? स्रोत वितरण 'sdist' के रूप में उपलब्ध है। –

+0

@ ब्रायन: मुझे 'sdist' के बारे में पता है, धन्यवाद। मैं मध्य-स्तरीय ओपन सोर्स प्रोजेक्ट का रखरखाव कर रहा हूं, और मैं सामान्य सम्मेलनों का पालन करना चाहता हूं (जैसे एक 'setup.py' जो पैकेजिंग/इंस्टॉलिंग प्रबंधित करता है)। मैं वास्तव में एक समाधान देखना चाहता हूं जो सिर्फ एक सेटअप स्क्रिप्ट का उपयोग करता है। – Constantinius

+0

मैं विवरण प्रदान नहीं कर सकता क्योंकि मुझे पहले ऐसी समस्या नहीं थी। एक दृष्टिकोण आपके स्वयं के 'sdist' कमांड प्रदान कर सकता है जो केवल पुराने मेटाडेटा के साथ पुराने 'sdist' को कॉल करता है जो लक्ष्य वितरण पर निर्भर करता है। वितरण को कमांड लाइन से एक विकल्प के रूप में प्रदान किया जा सकता है या 'platform.linux_distribution' का उपयोग करके उसी लक्ष्य वितरण को प्राप्त करने के लिए डिफ़ॉल्ट रूप से' setup.py' को कॉल करने में मशीन के रूप में प्रदान किया जा सकता है। – jcollado

उत्तर

11

मैंने पहले इस तरह कुछ लागू किया है ... sdist कमांड लाइन कमांड लाइन तर्कों को संभालने और इन पर आधारित डेटा फ़ाइलों को कुशल बनाने के लिए कमांड बढ़ाया जा सकता है। यदि आप python setup.py sdist --help चलाते हैं, तो इसमें आपकी कस्टम कमांड लाइन तर्क शामिल होंगे, जो कि अच्छा है। निम्नलिखित नुस्खा का प्रयोग करें:

from distutils import log 
from distutils.core import setup 
from distutils.command.sdist import sdist 

class CustomSdist(sdist): 

    user_options = [ 
     ('packaging=', None, "Some option to indicate what should be packaged") 
    ] + sdist.user_options 

    def __init__(self, *args, **kwargs): 
     sdist.__init__(self, *args, **kwargs) 

     self.packaging = "default value for this option" 

    def get_file_list(self): 

     log.info("Chosen packaging option: {self.packaging}".format(self=self)) 

     # Change the data_files list here based on the packaging option 
     self.distribution.data_files = list(
      ('folder', ['file1', 'file2']) 
     ) 
     sdist.get_file_list(self) 

if __name__ == "__main__": 

    setup(
     name = "name", 
     version = "version", 
     author = "author", 
     author_email = "author_email", 
     url = "url", 
     py_modules = [ 
      # ... 
     ], 
     packages = [ 
      # ... 
     ], 
#  data_files = default data files for commands other than sdist if you wish 
     cmdclass={ 
      'sdist': CustomSdist 
     } 
    ) 
+0

धन्यवाद उस समाधान के लिए बहुत कुछ, मुझे लगता है कि मैं उस के लिए जाऊंगा। – Constantinius

3

आप अतिरिक्त कस्टम कमांड लाइन पार्सिंग को जोड़ने के लिए setup.py का विस्तार कर सकते हैं। फिर आप कस्टम तर्क प्राप्त कर सकते हैं और इसे बाहर निकाल सकते हैं ताकि यह setuptools को प्रभावित न करे।

आप sys.argv में कमांड लाइन तर्क का उपयोग कर सकते हैं। setuptools.setup() करने के लिए कॉल संशोधित करने के लिए के रूप में, मैं तर्क पारित करने के लिए की एक शब्दकोश बनाने का सुझाव देते आदेश पंक्ति तर्क के आधार पर शब्दकोश को संशोधित करने, और फिर **dict अंकन का उपयोग setup() बुला, इसलिए जैसे:

from setuptools import setup 
import sys 

basic = {'name': 'my program'} 
extra = {'bonus': 'content'} 

if '--extras' in sys.argv: 
    basic.update(extra) 
    sys.argv.remove('--extras') 

setup(**basic) 

अधिक गहन के लिए कमांड लाइन पार्सिंग आप getopt module, या नए argparse module का उपयोग भी कर सकते हैं यदि आप केवल पायथन 2.7 और उच्चतर को लक्षित कर रहे हैं।

EDIT: मुझे Creating a new Distutils command शीर्षक वाले डिस्ट्यूटिल्स दस्तावेज़ों में भी एक अनुभाग मिला। यह एक उपयोगी संसाधन भी हो सकता है।

+1

मुझे पता चला है कि 'sdist' कमांड (distutils से) अज्ञात कमांड लाइन तर्कों के बारे में शिकायत करता है यदि आप इस तरह की चीज को आजमाते हैं। – wutz

+0

मैंने अभी परियोजना का नाम बदलने के लिए '--extras' विकल्प का उपयोग करके फीडपार्सर प्रोजेक्ट की setup.py फ़ाइल का उपयोग करके इसका परीक्षण किया है (और इसके परिणामस्वरूप आउटपुट फ़ाइल नाम)। यह एक त्रुटि के बिना काम किया। क्या आपने 'setup() 'फ़ंक्शन को कॉल करने से पहले' sys.argv' को संशोधित करने का प्रयास किया था? –

+0

यह एक अच्छा और सरल समाधान है, इसलिए इसके लिए +1। मुझे लगता है कि पहले Wutz उल्लेख किया है, कि कस्टम distutils आदेश बनाना संभव है। फिर भी धन्यवाद! – Constantinius

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