系统argvpython m的行为

2024-04-26 09:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

关于python3.5.2中的yu init_u.py行为的问题。我注意到了”系统argv“和”import\uu main\uu“根据调用时间的不同,它们的行为会有所不同。例如:

$ 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']

在这里,我出乎意料地措手不及系统argv在整个过程的生命周期中保持一致。我有一个直觉,为什么会发生这种情况,但我想知道是否有任何方法可以在重要时刻知道什么是真实的系统argv在\uuu init_uu.py模块中。在

作为参考,它看起来像是在Lib中改变了argv/runpy.py@_将“模块”作为“主”运行


Tags: 模块pathpyimporttreeinitmain系统
1条回答
网友
1楼 · 发布于 2024-04-26 09:34:28

简短版本:在运行之前,没有办法找到main_uu

长版:

  • -m标志导致系统argv[0]被操纵
  • 问题在于时间安排系统argv被操纵了
    • 主要的。c@Py_主管道执行一些标志解析并弹出模块名来调用
    • 主管道。c@运行模块包装纸runpy.py@_将“模块”作为“主”运行
    • _运行“模块”,因为“主”设置系统argv[0]但在调用后才会执行此操作runpy.py@_获取主模块详细信息
      • _get_module_details中的一个副作用实际上是导入包及其祖先,在_get_main_module_details可以解析之前执行u init_u.py脚本,因此无法设置_run_module_as_main系统argv在

我认为可以将其重构为系统argv是在导入包和祖先之前设置的(我认为是由module specs实现的),但还需要等待对runpy架构的增强,可能是以this的形式出现的,该格式在去年年底就已经开始了。在

相关问题 更多 >