2012-06-22 11 views
8

मैं एक मॉड्यूल है कि हमेशा की तरहमॉड्यूल को __main__ के रूप में कैसे आयात करें?

if __name__ == '__main__': 
    do stuff... 

मुहावरा है।

मैं इसे किसी अन्य मॉड्यूल से आयात करना चाहता हूं, और उसे उस कोड को चलाने में मूर्ख बनाना चाहता हूं। ऐसा करने का कोई रास्ता नहीं है?

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

उत्तर

8

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

हालांकि आदर्श पैटर्न होगा:

def do_stuff(): 
    ... stuff happens ... 

if __name__ == '__main__': 
    do_stuff() 

कि जिस तरह से आप कर सकते हैं:

from mymodule import do_stuff 
do_stuff() 

संपादित: मॉड्यूल कोड को संपादित करने में सक्षम नहीं होने पर स्पष्टीकरण के बाद उत्तर।

मैं कभी भी किसी भी उत्पादन कोड में इसकी अनुशंसा नहीं करता, यह "अपने जोखिम पर उपयोग" समाधान है। एक मुख्य श्लोक में

import mymodule 

with open(os.path.splitext(mymodule.__file__)[0] + ".py") as fh: 
    exec fh.read() 
+0

धन्यवाद, लेकिन मैंने सवाल स्पष्ट कर दिया है - मैं आयातित मॉड्यूल को संशोधित नहीं कर सकता क्योंकि सभी कोड को ऐसा करने के लिए do_stuff फ़ंक्शन में है। – xorsyst

3

उस कोड को फ़ंक्शन में रखें, और इसे उस मॉड्यूल से कॉल करें जिसे आप इसे आयात कर रहे हैं।

def stuff(): 
    ... 

if __name__ == '__main__': 
    stuff() 

और फिर मॉड्यूल में आप इसे में आयात कर रहे हैं:

import module 
module.stuff() 
+0

धन्यवाद, लेकिन मैं सवाल स्पष्ट किया गया है - मुझे लगता है कि जैसे एक सामान समारोह में सभी कोड के लिए आयातित मॉड्यूल को संशोधित नहीं कर सकते हैं:

भले ही, जिस तरह से अजगर यह करता है इस तरह है । – xorsyst

0

एक समारोह में यह रखो:

def _main(): 
    do stuff 

if __name__ == '__main__': 
    main() 
+0

धन्यवाद, लेकिन मैंने सवाल स्पष्ट कर दिया है - मैं आयातित मॉड्यूल को संशोधित नहीं कर सकता क्योंकि सभी कोड इस तरह के मुख्य कार्य में हैं। – xorsyst

0

कोड आमतौर पर कभी नहीं भावना सीधे चलाने के लिए बनाता है। यदि आप इसे चलाने के लिए चाहते हैं तो इसे किसी अन्य पायथन दुभाषिया में चलाने के लिए subprocess का उपयोग करें।

+0

धन्यवाद। इस अवसर में यह करता है, और उपप्रवाह के साथ इसे चलाने से मेरी समस्या हल नहीं होती है। – xorsyst

0

यहाँ पायथन में एक मुख्य मॉड्यूल का एक उदाहरण है:

#! /usr/bin/env python 
import sys 
import os 

def main(arg1, arg2, arg3): 
    print(arg1, arg2, arg3) 

if __name__ == "__main__": 
    main(*sys.argv) 

लेकिन क्या आप भी किसी भी मॉड्यूल में

def main(): 
    #The module contains Python code specific to the library module, 
    #like tests, and follow the module with this: 

if __name__ == "__main__": 
    main(*sys.argv) 

शामिल आप के रूप में मुख्य चलाना चाहते है कर सकते हैं।

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

+0

धन्यवाद, लेकिन मैंने सवाल स्पष्ट कर दिया है - मैं आयातित मॉड्यूल को संशोधित नहीं कर सकता क्योंकि सभी कोड इस तरह के मुख्य कार्य में हैं। – xorsyst

7

जैसा कि अन्य उत्तरों में बताया गया है, यह एक बुरा विचार है, और आपको इस मुद्दे को किसी अन्य तरीके से हल करना चाहिए।

import runpy 
result = runpy._run_module_as_main("your.module.name")) 
संबंधित मुद्दे