[英]How to execute if __name__ != "__main__"?
我有一個我無法更改的代碼,名為 temp.py,其中包含
if __name__ == "__main__":
*some pieces of code not a function call*
我想import temp
到我可以編輯的其他文件中,但導入不會運行上述部分。 我知道我可以使用 subprocess 來運行temp.py
但這不是我想要的。 我想完全導入模塊但不能更改代碼。 我聽說過一個名為imp
的模塊,但現在已棄用。
編輯:
我知道 if 語句下的代碼並不意味着在導入時被執行,但讓我們假設temp.py
是以一種非常糟糕的方式編寫的,我無法更改它。
您正在嘗試 go 針對導入系統。 幾乎任何你最終為實現這一目標而做的事情都將是一個 hack。
考慮我們有一個文件:
(py39) Juans-MacBook-Pro:~ juan$ cat subvert.py
def foo(x):
print("Hello, ", x)
if __name__ == "__main__":
foo("Goodbye")
注意,如果我打開一個 REPL,我在__main__
中,所以在你的頂級腳本中,你可以這樣做:
(py39) Juans-MacBook-Pro:~ juan$ python
Python 3.9.5 (default, May 18 2021, 12:31:01)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> __name__
'__main__'
>>> exec(open("subvert.py").read())
Hello, Goodbye
當然,直接在同一個命名空間中直接執行源代碼可能不是你想要的......
注意,我們可以傳遞自己的命名空間:
>>> namespace = {"__name__": "__main__"}
>>> exec(open("subvert.py").read(), namespace)
Hello, Goodbye
所以我們模塊的命名空間不會被破壞。
現在,如果你想在它后面有一個實際的模塊,你可以像這樣拼湊起來:
>>> import types
>>> module = types.ModuleType("__main__")
>>> module
<module '__main__'>
>>> exec(open("subvert.py").read(), module.__dict__)
Hello, Goodbye
>>> module.foo('bar')
Hello, bar
我不希望這些都能很好地工作。 它不會具有完全加載模塊的所有屬性,如果您發現需要充實它,請查看importlib
。
這樣的事情確實是不好的做法,但會起作用:
file1.py 有“主要”部分:
def foo1():
print("foo1")
if __name__ == '__main__':
print("main function started")
foo1()
print("main function finished")
file2.py 是一個中間文件:
from file1 import *
with open('file1.py') as f:
lines = f.readlines()
a = "if __name__ == '__main__':\n"
new_main = ["def main():\n"] + lines[lines.index(a)+1:]
exec("".join(new_main))
file3.py 用於導入 file2,就好像它是 file1 模塊一樣:
import file2
file2.main()
file2.foo1()
運行 file3.py 時為 output:
main function started
foo1
main function finished
foo1
Python 程序員使用以下機制來避免在另一個腳本上導入主腳本。
if __name__ == "__main__":
# TODO
在這里閱讀它的理念。
當一些代碼使用if __name__ == "__main__":
意味着你不應該導入它的代碼並且這項工作是不正確的。
但是你可以使用這個機制:
def main():
# TODO
if __name__ == "__main__":
main()
在這種情況下,每個人都可以導入您的主腳本並使用main
function。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.