gpt4 book ai didi

python - 使用 python -m 的 sys.argv 行为

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:35 24 4
gpt4 key购买 nike

关于 python 3.5.2 中 __init__.py 行为的问题。我注意到“sys.argv”和“import __main__”的行为因调用时间而异。例如:

$ tree 
└── subdir
├── __init__.py : "import sys; print(sys.argv)"
├── __main__.py : "import sys; print(sys.argv)"

$ python -m subdir
['-m']
['/path/to/code/subdir/__main__.py']

在这里我措手不及,因为我希望 sys.argv 在整个进程生命周期中是相同的。我对为什么会发生这种情况有直觉,但我想知道是否有任何方法可以在导入时知道 __init__.py 模块中真正的 sys.argv 是什么。

作为引用,它看起来像在 Lib/runpy.py@_run_module_as_main 中更改了 argv

最佳答案

简短版本:无法在运行之前找到 __main__

长版:

  • -m 标志导致 sys.argv[0] 被操纵
  • 问题在于操作 sys.argv 的时间
    • main.c@Py_main 做一些标志解析并弹出模块名称以调用
    • main.c@RunModule 对 runpy.py@_run_module_as_main 的包装
    • _run_module_as_main 设置 sys.argv[0] 但直到调用 runpy.py@_get_main_module_details 之后才这样做
      • _get_module_details 中的一个副作用实际上是在 _get_main_module_details 可以解析之前导入包及其执行 __init__.py 脚本的祖先,因此 _run_module_as_main 无法设置 sys.argv

我认为这可以重构,以便在 _get_module_details 导入包和祖先之前设置 sys.argv(我认为可以通过 module specs 实现)但是必须等待对 runpy 体系结构的增强,可能采用以下形式的 this截至去年年底,该项目仍在进行中。

关于python - 使用 python -m 的 sys.argv 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42076706/

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