gpt4 book ai didi

python - 使用 execfile 时如何防止运行 __main__ 守卫?

转载 作者:太空狗 更新时间:2023-10-30 02:04:08 25 4
gpt4 key购买 nike

2003 年发布的 BDFL an article about how to write a Python main function .他的例子是这样的:

import sys
import getopt

class Usage(Exception):
def __init__(self, msg):
self.msg = msg

def main(argv=None):
if argv is None:
argv = sys.argv
try:
try:
opts, args = getopt.getopt(argv[1:], "h", ["help"])
except getopt.error, msg:
raise Usage(msg)
# more code, unchanged
except Usage, err:
print >>sys.stderr, err.msg
print >>sys.stderr, "for help use --help"
return 2

if __name__ == "__main__":
sys.exit(main())

main() 的可选参数 argv 的原因是,“我们更改 main() 以采用可选的 argv 参数,它允许我们从交互式 Python 提示符中调用它。”

他这样解释代码的最后一行:

Now the sys.exit() calls are annoying: when main() calls sys.exit(), your interactive Python interpreter will exit! The remedy is to let main()'s return value specify the exit status. Thus, the code at the very end becomes

if __name__ == "__main__":
sys.exit(main())

and the calls to sys.exit(n) inside main() all become return n.

但是,当我在 Spyder 控制台中运行 Guido 的代码时,它会终止解释器。我在这里错过了什么?我的意图是只导入 具有这种类型的 main() 的模块,而不仅仅是使用 execfilerunfile< 来执行它们?这不是我倾向于进行交互式开发的方式,尤其是考虑到它需要我记住在 import fooreload(foo) 之间来回切换。

我知道我可以从 getopt 捕获 SystemExit 或尝试使用一些黑魔法来检测 Python 是否正在交互式运行,但我认为这些都不是 BDFL意图。

最佳答案

您的选择是不使用 execfile 或将不同的 __name__ 值作为全局值传递:

execfile('test.py', {'__name__': 'test'})

默认是将文件作为脚本运行,这意味着 __name__ 设置为 __main__

您引用的文章仅适用于import

关于python - 使用 execfile 时如何防止运行 __main__ 守卫?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23714219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com