2012-06-22 48 views
8

我有了平常如何將模塊導入爲__main__?

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

成語的模塊。

我想從另一個模塊導入,並欺騙它運行該代碼。有沒有辦法做到這一點?

我應該提到,由於我不會進入這裏的原因,我無法更改導入模塊中的代碼。我需要以某種方式修改導入過程,以便在導入時它的名字是主要的,也許使用ihook或類似的。

回答

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在另一個Python解釋器中運行它。

+0

謝謝。在這種情況下,它使用子進程運行它並不能解決我的問題。 – xorsyst

0

這裏是Python中的主要模塊的例子:

#! /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

正如在其他答案中指出的那樣,這是一個壞主意,你應該以其他方式解決問題。

無論如何,Python做它的方式是這樣的:

import runpy 
result = runpy._run_module_as_main("your.module.name"))