2013-03-06 8 views
6

मैं स्कॉन्स और पायथन के लिए नया हूं। मैं सोच रहा था कि क्या एक अजगर लिपि के भीतर से स्कैन का आह्वान करने का कोई तरीका है।एक पायथन स्क्रिप्ट से स्कैन को आमंत्रित करना

मेरी पायथन लिपि उपयोगकर्ता से स्वीकार करती है, निर्देशिकाओं की एक सूची जहां कोड को संकलित करने के लिए कोड स्थित है (कुछ अन्य गैर-तुच्छ चीजों को करने के अलावा)। यह एक स्ट्रिंग भी उत्पन्न करता है जिसे निष्पादन योग्य स्कैन द्वारा नामित किया जाना है।

मैं इस जानकारी को अपनी पायथन स्क्रिप्ट से स्कैन करने के लिए पास करना चाहता हूं, और फिर स्कैन का आह्वान करता हूं। क्या ऐसा करने का कोई आसान तरीका है?

मैं निम्नलिखित संभावनाओं के बारे में सोच सकते हैं:

  • उपयोग subprocess.call("scons"...) मुझे यकीन है कि नहीं कर रहा हूँ अगर SCons सभी जानकारी मैं आदेश पंक्ति तर्क
  • अजगर स्क्रिप्ट है के रूप में पारित करने के लिए की जरूरत को स्वीकार करता है एक फ़ाइल में लिखने । स्कैनस्क्रिप्ट फ़ाइल को पार्स करें और जानकारी पास हो गई है।

उत्तर

2

मैंने subprocess.call() पायथन फ़ंक्शन का उपयोग करके यह कुछ विशेष और जटिल कमांड लाइन तर्कों को समाहित करने के लिए किया जो कि मैं जिस विशेष परियोजना पर काम कर रहा था, के लिए आवश्यक है। ऐसे लोग हैं जिन्होंने तर्क दिया कि आमंत्रण को सरल बनाना चाहिए ताकि इसे समाहित करने की आवश्यकता न हो, लेकिन यह एक अलग विषय है :)

कमांड लाइन तर्कों का उपयोग करने के बजाय विचार करने का एक विकल्प SCONSFLAGS पर्यावरण चर के रूप में उपयोग करना है उल्लेख किया गया here। निजी तौर पर, मैं इस विकल्प का उपयोग नहीं करना पसंद करता हूं।

आपको आवश्यक सभी विकल्पों को कमांड लाइन विकल्प के रूप में पास किया जा सकता है। एससीओएस कमांड लाइन तर्क को कस्टमाइज़ और संभालने का एक अच्छा तरीका स्कैन AddOption() फ़ंक्शन के साथ है। इसके अतिरिक्त, आप स्कैन ARGUMENTS dictionary का उपयोग कर सरल variable=value चर प्राप्त कर सकते हैं। अन्य संबंधित SCons कमांड लाइन फ़ंक्शंस GetOption() और SetOption() हैं।

निष्पादन योग्य नाम के लिए एक स्ट्रिंग में गुजरने के संबंध में: SCons इसे पसंद नहीं कर सकते हैं। कम से कम, आप एक विशेष निष्पादन योग्य स्ट्रिंग के साथ एक बार अपनी स्क्रिप्ट निष्पादित करने पर विचार करें, फिर एक अलग समय के साथ दूसरी बार, फिर आप साफ़ करना चाहते हैं, यदि आप उसी निष्पादन योग्य नाम से स्कैन निष्पादित नहीं होते हैं तो आप निष्पादन योग्य छोड़ सकते हैं।

3

ठीक है, मुझे लगता है कि यह सिद्धांत में संभव है। scons निष्पादन योग्य ही एक पायथन लिपि है और यह चर को संशोधित करने के बाद SCons.Script.main() निष्पादित करता है। लेकिन आपको शायद स्रोतों में गहराई से खोदना शुरू करना होगा ताकि वास्तव में यह समझ सकें कि इसे अपनी इच्छानुसार कैसे किया जाए।

एक बहुत साफ समाधान आपकी स्क्रिप्ट को स्कॉन्स्क्रिप्ट फ़ाइल से कॉल कर रहा है, जो शायद इच्छित उद्देश्य है और इसे अधिक आसान साबित करना चाहिए।

+1

मैंने सीधे 'SCons.Script.main() 'को कॉल करने के लिए देखा, और फैसला किया कि यह इसके लायक नहीं है। मैं एक 'subprocess में कॉल लपेटने के लिए चला गया।मेरे उत्तर में उल्लिखित कमांड लाइन तर्कों को कॉल करें() 'आमंत्रण और हैंडलिंग करें। मुझे लगता है कि वास्तविक स्कॉन्स स्क्रिप्ट को बाईपास करने की कोशिश करने से चोट लगने की दुनिया हो सकती है :) – Brady

+0

मुझे लगता है कि यह मेरे प्रश्न का उत्तर नहीं देता है: अगर मैं अपनी पाइथन लिपि को स्कॉन्स्क्रिप्ट से कॉल करता हूं, तो मैं इस बारे में जानकारी कैसे पास करूं कि मेरे पास _before_ scoking invons प्राप्त किया? –

+0

क्या स्कैन से पहले अपनी स्क्रिप्ट को आमंत्रित करने की वास्तविक आवश्यकता है? आप स्कैनस्क्रिप्ट फ़ाइल से मॉड्यूल के रूप में अपनी स्क्रिप्ट आयात कर सकते हैं और फिर आवश्यकतानुसार आवश्यक इनपुट जमा कर सकते हैं। तकनीकी रूप से वही नहीं है, जहां तक ​​उपयोगकर्ता का संबंध है, इसमें कोई अंतर नहीं है। यदि यह कोई विकल्प नहीं है, तो ब्रांडी द्वारा प्रस्तावित मार्ग एक व्यवहार्य समाधान है। –

1

उत्तर के लिए धन्यवाद। मैं इस विधि का उपयोग कर समाप्त हुआ:

पायथन लिपि एक पाठ फ़ाइल में विकल्पों की एक सूची लिखता है, इसे बंद करता है, और scons -f MySConscript_file को उपप्रोसेस कॉल का उपयोग करके आमंत्रित करता है। SConstruct टेक्स्ट फ़ाइल से मूल्यों को एक सूची में पढ़ता है, और उनका उपयोग करता है।

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