簡體   English   中英

if __name__?= "__main__" 如何執行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM