我有了平常如何將模塊導入爲__main__?
if __name__ == '__main__':
do stuff...
成語的模塊。
我想從另一個模塊導入,並欺騙它運行該代碼。有沒有辦法做到這一點?
我應該提到,由於我不會進入這裏的原因,我無法更改導入模塊中的代碼。我需要以某種方式修改導入過程,以便在導入時它的名字是主要的,也許使用ihook或類似的。
我有了平常如何將模塊導入爲__main__?
if __name__ == '__main__':
do stuff...
成語的模塊。
我想從另一個模塊導入,並欺騙它運行該代碼。有沒有辦法做到這一點?
我應該提到,由於我不會進入這裏的原因,我無法更改導入模塊中的代碼。我需要以某種方式修改導入過程,以便在導入時它的名字是主要的,也許使用ihook或類似的。
還有就是,執行腳本,而不是將其導入的。但我認爲這是一個非常黑客的解決方案。
然而,理想模式應該是:
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()
將該代碼放入一個函數中,並從您要導入的模塊中調用該代碼。
def stuff():
...
if __name__ == '__main__':
stuff()
,然後模塊在你將它導入到:
import module
module.stuff()
謝謝,但我已經澄清了這個問題 - 我不能修改導入的模塊將所有的代碼在那樣的東西功能。 – xorsyst
把它放在一個函數:
def _main():
do stuff
if __name__ == '__main__':
main()
謝謝,但我已經澄清了這個問題 - 我無法修改導入的模塊以使主函數具有所有代碼。 – xorsyst
這裏是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)
任何模塊中,你想運行爲主。例如,如果你有一個庫模塊,你總是可以使用這個構造來執行特定的測試。
謝謝,但我已經澄清了這個問題 - 我無法修改導入的模塊,使其具有像這樣的主函數中的所有代碼。 – xorsyst
正如在其他答案中指出的那樣,這是一個壞主意,你應該以其他方式解決問題。
無論如何,Python做它的方式是這樣的:
import runpy
result = runpy._run_module_as_main("your.module.name"))
謝謝,但我澄清了這個問題 - 我無法修改導入的模塊以使do_stuff函數中的所有代碼都像這樣。 – xorsyst