2012-07-06 12 views
5

मान लें कि मेरे पास दो पायथन स्क्रिप्ट A.py और B.py हैं।एक अन्य पायथन प्रोग्राम (कुछ आवश्यकताओं के साथ) से पाइथन प्रोग्राम चलाएं

  1. बी मानना ​​है कि यह __main__ है (ताकि बी में एक if __name__=="__main__" ब्लॉक में है कि कोड चलेंगे)
  2. बी वास्तव में नहीं है: मैं एक तरीका है कि इस तरह से एक के भीतर से बी को चलाने के लिए देख रहा हूँ __main__ (उदाहरण के लिए, ऐसा नहीं है, उदाहरण के लिए, sys.modules में "__main__" प्रविष्टि को ओवरराइट करें)
  3. बी के भीतर उठाए गए अपवादों को ए (यानी, except ए में क्लॉज के साथ पकड़ा जा सकता है)।
  4. उन अपवादों को छोड़कर यदि पकड़े नहीं, बी

मैं विभिन्न तकनीकों की कोशिश की है के भीतर एक सही ट्रैस बैक संदर्भित लाइन नंबर जेनरेट, लेकिन कोई भी मेरी सभी आवश्यकताओं को पूरा करने लगते हैं।

  • उपप्रक्रिया मॉड्यूल से उपकरणों का उपयोग का मतलब बी में अपवाद ए के लिए प्रचार नहीं करते
  • execfile("B.py", {}) रन बी, लेकिन यह यह मुख्य है नहीं लगता है।
  • execfile("B.py", {'__name__': '__main__'}) बीटीवी को लगता है कि यह मुख्य है, लेकिन यह अपवाद ट्रेसबैक प्रिंटिंग को भी खराब कर रहा है, ताकि ट्रेसबैक ए (यानी वास्तविक __main__) के भीतर लाइनों को संदर्भित कर सकें।
  • __main__ साथ imp.load_source का उपयोग कर के रूप में नाम लगभग काम करता है, सिवाय इसके कि यह वास्तव में sys.modules को संशोधित करता है, इस प्रकार __main__

के मौजूदा मूल्य पर stomping वहाँ किसी भी तरह से मैं क्या चाहते हैं पाने के लिए है?

(कारण मैं ऐसा कर रहा हूं क्योंकि मैं मौजूदा पुस्तकालय पर कुछ सफाई कर रहा हूं। इस पुस्तकालय में कोई वास्तविक परीक्षण सूट नहीं है, केवल "उदाहरण" स्क्रिप्ट का एक सेट है जो कुछ आउटपुट उत्पन्न करता है। मैं कोशिश कर रहा हूं यह सुनिश्चित करने के लिए परीक्षणों के रूप में लाभ उठाने के लिए कि मेरा क्लीनअप इन उदाहरणों को निष्पादित करने की लाइब्रेरी की क्षमता को प्रभावित नहीं करता है, इसलिए मैं प्रत्येक टेस्ट सूट में से प्रत्येक उदाहरण स्क्रिप्ट को चलाने के लिए चाहता हूं। मैं इन स्क्रिप्ट से अपवाद देख सकता हूं टेस्ट स्क्रिप्ट इसलिए परीक्षण स्क्रिप्ट एक सामान्य सबप्रोसेसर त्रुटि की रिपोर्ट करने की बजाय विफलता के प्रकार की रिपोर्ट कर सकती है, जब भी एक उदाहरण स्क्रिप्ट कुछ अपवाद उठाती है।)

उत्तर

2

मेरे अपने प्रश्न का उत्तर देना क्योंकि परिणाम तरह का दिलचस्प है और दूसरों के लिए उपयोगी हो सकता है:

यह पता चला मैं गलत था: execfile("B.py", {'__name__': '__main__'} सब के बाद जाने के लिए रास्ता है। यह सही ढंग से ट्रेसबैक का उत्पादन करता है। जो मैं गलत रेखा संख्याओं के साथ देख रहा था वह अपवाद लेकिन चेतावनियां थीं। ये चेतावनियां warnings.warn("blah", stacklevel=2) का उपयोग करके उत्पादित की गई थीं। stacklevel=2 तर्क को चेतावनी चेतावनी जैसे चीजों के लिए अनुमति देने की अनुमति दी जाती है जहां चेतावनी कॉल के बजाय बहिष्कृत चीज़ का उपयोग किया जाता है (the documentation देखें)।

हालांकि, ऐसा लगता है कि execfile-d फ़ाइल इस उद्देश्य के लिए "स्टैक स्तर" के रूप में नहीं गिना जाता है, और stacklevel उद्देश्यों के लिए अदृश्य है। तो यदि execfile-d मॉड्यूल के शीर्ष स्तर पर कोड स्टैकलेवल 2 के साथ चेतावनी का कारण बनता है, तो execfile-d स्रोत फ़ाइल में दाएं पंक्ति संख्या पर चेतावनी नहीं उठाई जाती है; इसके बजाय यह फ़ाइल की इसी लाइन संख्या पर उठाया जाता है जो execfile चला रहा है।

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

+0

दिलचस्प समाधान। मुझे संदेह है (और उम्मीद है ..) मुझे कभी इसकी आवश्यकता होगी, लेकिन चीजें पाइथन की अनुमति देता है और सक्षम बनाता है। –

2

आपका उपयोग केस समझ में आता है, लेकिन मुझे अभी भी लगता है कि आप बेहतर होंगे परीक्षणों को दोबारा सुधारना जैसे कि उन्हें बाहरी रूप से चलाया जा सकता है।

क्या आप स्क्रिप्ट का परीक्षण करते हैं इस तरह कुछ है?

def test(): 
    pass 

if __name__ == '__main__': 
    test() 

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

import test1 
test1.test() 
import test2 
test2.test() 

चल परीक्षण के लिए एक आम इंटरफेस प्रदान करते हैं, कि परीक्षण के लिए खुद का उपयोग करें। __main__ चेक में कोड का एक बड़ा ब्लॉक होने के कारण एक अच्छी बात नहीं है।

क्षमा करें कि मैंने आपके द्वारा पूछे गए प्रश्न का उत्तर नहीं दिया है, लेकिन मुझे लगता है कि मूल परीक्षण कोड से भी को विचलित किए बिना यह सही समाधान है।

+0

दुर्भाग्य से नहीं। कुछ टेस्ट स्क्रिप्ट ऐसा करते हैं, लेकिन दूसरों के पास कोड को शीर्ष-स्तरीय मॉड्यूल कोड के रूप में है। यह अजीब मामलों का मिश्रण है। मैंने समस्या का पता लगाया और अपने सवाल का जवाब दिया, लेकिन आपकी सलाह के लिए धन्यवाद। काश मैं इसका पालन कर सकता हूं! :-) – BrenBarn

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