2010-05-17 11 views
7

मैं थोड़ा अपरंपरागत तरीके से पाइथन की डिस्ट्यूल्स 'या setuptools' सेटअप() फ़ंक्शन को कॉल करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि इस तरह के उपयोग के लिए आसवन का मतलब है या नहीं।कमांड लाइन को पार्स किए बिना कमांड नाम/विकल्पों के साथ सीधे distutils 'या setuptools' setup() फ़ंक्शन को कॉल करें?

from distutils.core import setup 

setup(name='Distutils', 
     version='1.0', 
     description='Python Distribution Utilities', 
     author='Greg Ward', 
     author_email='[email protected]', 
     url='http://www.python.org/sigs/distutils-sig/', 
     packages=['distutils', 'distutils.command'], 
    ) 

आम तौर पर: - (setuptools उपयोग लगभग समान है distutils डॉक्स से शब्दशः उठाया)

उदाहरण के लिए, मान लीजिए कि मैं वर्तमान में एक 'setup.py' फ़ाइल है, जो इस तरह दिखता है चलो , इस मॉड्यूल के आरपीएम के लिए बस .spec फ़ाइल बनाने के लिए, मैं python setup.py bdist_rpm --spec-only चला सकता हूं, जो कमांड लाइन को पार करता है और RPM- विशिष्ट सामग्री को संभालने के लिए 'bdist_rpm' कोड को कॉल करता है। .spec फ़ाइल './dist' में समाप्त होती है।

मैं अपना सेटअप() आमंत्रण कैसे बदल सकता हूं ताकि यह '-spec-only' विकल्प के साथ 'bsist_rpm' कमांड चला सके, बिना पार्सिंग कमांड लाइन पैरामीटर के? क्या मैं कमांड नाम और विकल्प को सेटअप() के पैरामीटर के रूप में पास कर सकता हूं? या मैं मैन्युअल रूप से कमांड लाइन बना सकता हूं, और इसके बजाय पैरामीटर के रूप में पास कर सकता हूं?

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

पृष्ठभूमि के लिए, मैं कुछ रिलीज-प्रबंधन शैल स्क्रिप्ट को एक पायथन प्रोग्राम में परिवर्तित कर रहा हूं। आगे के प्री-रिलीज परीक्षण के लिए .spec फ़ाइल जेनरेट करने के लिए कार्यों में से एक 'setup.py' चला रहा है। बाहरी कमांड के रूप में 'setup.py' चलाना, अपने कमांड लाइन विकल्पों के साथ, एक अजीब विधि की तरह लगता है, और यह शेष कार्यक्रम को जटिल बनाता है। मुझे लगता है कि एक और पाइथोनिक तरीका हो सकता है।

+0

मुझे प्रश्न पसंद है। मेरे लिए ऐसा लगता है कि 'सेटअप()' खराब रूप से डिज़ाइन किया गया है - इसे कम से कम 'sys.argv' को कुछ जादू करने के बजाय तर्क के रूप में लेना चाहिए। पैरामीटर 'sys.argv' (जैसे' argparse' 'में भी डिफ़ॉल्ट हो सकता है, लेकिन फ़ंक्शन हस्ताक्षर में दस्तावेज और दृश्य दोनों होना चाहिए। – abukaj

उत्तर

9

कभी यह कोशिश की, लेकिन मैं distutils/core.py, जहां मैं setup() के शुरू के निकट इस नोटिस में देखने के लिए हुआ:

if 'script_name' not in attrs: 
    attrs['script_name'] = os.path.basename(sys.argv[0]) 
if 'script_args' not in attrs: 
    attrs['script_args'] = sys.argv[1:] 

इसलिए, यह के रूप में यदि आप कर सकते हैं "नकली बाहर लग रहा है "सेटअप() जोड़कर:

setup(
    ... 
    script_name = 'setup.py', 
    script_args = ['bdist_rpm', '--spec-only'] 
) 
+0

@ ig0775: धन्यवाद, यह वही है जो मैं करना चाहता था। मैंने अभी इसका परीक्षण किया, और यह ठीक काम करता है। बहुत साफ दिख रहा है, भी। –

1

बस" नकली "कमांडलाइन मापदंडों - जैसे, आप स्क्रिप्ट के साथ शुरू

import sys 

sys.argv[1:] = ['bdist_rpm', '--spec-only'] 

from distutils.core import setup 

setup(name='Distutils', 

आदि, आदि के बाद, distutils कमांड लाइन पैरामीटर प्राप्त करता है: यह sys.argv में दिखता है! तो, बस sys.argv को ठीक वैसे ही सेट करें, जैसा कि आप चाहते हैं, और जो भी कमांड लाइन गुमराह किए गए उपयोगकर्ता को पूरी तरह से अनदेखा कर दिया जाएगा। len(sys.argv) > 1 इससे पहले कि आप sys.argv संशोधित - -

असल में, आप जांच करने के लिए करता है, तो उपयोगकर्ता किसी भी तर्क आप कर रहे हैं के बारे में अनदेखी करने के लिए प्रवेश किया चाहते हो सकता है और एक चेतावनी देते हैं, या से बचने के sys.argv में परिवर्तन, या उपयोगकर्ता ने टाइप किया है, "मर्ज करें" ... लेकिन यह वास्तव में जो आपने पूछा है उससे काफी अलग है, इसलिए मैं इसे छोड़ने जा रहा हूं ;-)।

+0

यह मेरे लिए हुआ था, लेकिन यह बहुत गन्दा लग रहा था।लेकिन अगर यह @ ig0774 की विधि के लिए नहीं था, तो शायद यह होगा कि मैं इसे कैसे संभालेगा। –

+0

@ RyanB.Lynch: * यह गन्दा लग रहा था * - उदास, उदास बात यह है: Distutils 'और सेटअप उपकरण' run_setup' दिनचर्या बिल्कुल ठीक है, केवल शीर्ष पर कुछ टुकड़े के साथ। आप इसे देख सकते हैं, उदाहरण के लिए, [यहां] (http://github.com/pypa/setuptools/blob/master/setuptools/sandbox.py) स्रोतों में ('run_setup' के लिए खोजें)। – Wrzlprmft

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