2009-11-10 15 views
22

मेरे पास "उदाहरण" नामक एक लाइब्रेरी है जिसे मैं अपनी वैश्विक साइट-पैकेज निर्देशिका में स्थापित कर रहा हूं। हालांकि, मैं दो संस्करणों को स्थापित करने में सक्षम होना चाहता हूं, एक उत्पादन के लिए और एक परीक्षण के लिए (मेरे पास एक वेब एप्लिकेशन और अन्य चीजें हैं जो इस तरह से संस्करणित हैं)।कस्टम distutils आदेश

क्या "python setup.py चरण" निर्दिष्ट करने का कोई तरीका है जो न केवल साइट-पैकेज में एक अलग अंडे स्थापित करेगा, बल्कि "example" से "example_stage" या कुछ समान मॉड्यूल का नाम बदल देगा?

यदि आसुत यह नहीं कर सकते हैं, तो क्या कोई अन्य उपकरण है जो कर सकता है?

उत्तर

13

निश्चित रूप से, आप नए आदेशों के साथ distutils का विस्तार कर सकते हैं। अपने distutil विन्यास फाइल में, जोड़ें:

[global] 
command-packages=foo.bar 

इस distutils पैकेज ही है, अपने घर निर्देशिका में ..pydistutils.cfg (विंडोज पर कोई प्रमुख डॉट), या मौजूदा निर्देशिका में setup.cfg में distutils.cfg में हो सकता है।

फिर आपको अपने पायथन की साइट-पैकेज निर्देशिका में foo.bar पैकेज की आवश्यकता है।

फिर उस पैकेज में आप अपने नए वांछित आदेशों जैसे stage को लागू करने वाले वर्गों को जोड़ते हैं, distutils.cmd उप-वर्गीकरण - दस्तावेज़ कमजोर हैं, लेकिन बहुत सारे उदाहरण हैं क्योंकि सभी मौजूदा डिस्ट्यूट कमांड भी इस तरह से बनाए गए हैं।

+2

यह सवाल पूछा गया है, लेकिन वर्चुअलएन्व समस्या का एक बेहतर जवाब है। –

4

यदि आप एकाधिक संस्करण का उपयोग करना चाहते हैं तो virtualenvvirtualenvwrapper सहायता कर सकते हैं।

3

Alex's answer देखें यदि आप distutils के साथ ऐसा करने का कोई तरीका चाहते हैं, लेकिन मुझे इस तरह की चीज़ के लिए बेहतर होने के लिए Paver मिल गया है। यह कस्टम आदेश बनाने या मौजूदा लोगों को ओवरराइड करना बहुत आसान बनाता है। इसके अलावा यदि आप distutils या setuptools के लिए उपयोग किया जाता है तो संक्रमण बहुत मुश्किल नहीं है।

+0

पेवर बहुत रोचक कामकाजी कार्यक्षमताएं और शॉर्टकट प्रदान करता है। दूसरी ओर, यह distutils के शीर्ष पर एक और प्रतिमान (और वास्तुकला) जोड़ता है। मैं एक सादा setup.py फ़ाइल पसंद करूंगा जो स्वयं निहित है और जो कुछ भी करने की आवश्यकता है वह करता है। –

49

यह आसानी से distutils.core.Command sub.pyassing द्वारा distutils के साथ किया जा सकता है setup.py के अंदर।

उदाहरण के लिए:

from distutils.core import setup, Command 
import os, sys 

class CleanCommand(Command): 
    description = "custom clean command that forcefully removes dist/build directories" 
    user_options = [] 
    def initialize_options(self): 
     self.cwd = None 
    def finalize_options(self): 
     self.cwd = os.getcwd() 
    def run(self): 
     assert os.getcwd() == self.cwd, 'Must be in package root: %s' % self.cwd 
     os.system('rm -rf ./build ./dist') 

आदेश सक्षम करने के लिए आप इसे सेटअप में संदर्भ होना चाहिए():

setup(
    # stuff omitted for conciseness. 
    cmdclass={ 
     'clean': CleanCommand 
} 

ध्यान दें कि आप इस तरह के रूप में इस तरह से भी निर्मित आदेशों ओवरराइड कर सकते हैं, क्या मैंने 'साफ' किया था। (मैं कैसे निर्मित संस्करण 'जिले' और 'निर्माण' निर्देशिका पीछे छोड़ दिया पसंद नहीं आया।)

% python setup.py --help-commands | grep clean 
    clean   custom clean command that forcefully removes dist/build dirs. 

कि उपयोग किया जाता है सम्मेलनों की एक संख्या हैं:

  • आप यह निर्दिष्ट user_options के साथ कोई भी कमांड लाइन तर्क।
  • आप आरंभिक_ऑप्शन() विधि के साथ उपयोग करने वाले किसी भी चर घोषित करते हैं, जिसे सबक्लास के लिए अपना कस्टम नेमस्पेस सेट करने के प्रारंभ में प्रारंभ करने के बाद कहा जाता है।
  • finalize_options() विधि रन() से ठीक पहले कहा जाता है।
  • कमांड की गड़बड़ी रन() में होगी, इसलिए इससे पहले कि कोई अन्य प्रीपे काम करना सुनिश्चित करें।

सबसे अच्छा उदाहरण का उपयोग करने के लिए सिर्फ PYTHON_DIR/distutils/आदेश पर पाया डिफ़ॉल्ट से कोई एक आदेश के लिए स्रोत कोड को देखने के लिए या build.py ऐसे रूप install.py।

+0

[स्रोत] का उपयोग करें (https://bitbucket.org/pypy/pypy/src/9d88b4875d6e12570a635848524bb7f5283ee558/lib-python/2.7/distutils/command?at=translation-cleanup), ल्यूक। –

+0

और [दस्तावेज़ पढ़ें] (https://docs.python.org/2/distutils/apiref.html#creating-a-new-distutils-command)। –