阅读完所有内容后,我找不到答案:
runpy
标准模块-m
选项理由:
如果在没有-m
选项的情况下运行使用相对导入的测试脚本,我可以打印警告消息,而不是让用户使用标准回溯导致ValueError: Attempted relative import in non-package
异常。在不知情的情况下,我可以捕获此异常并且只有建议缺少-m
选项可能是错误的原因。
答案 0 :(得分:3)
免责声明:这只是一个观察,我没有在文档中看到它,因此它可能依赖于实现,并且可能在不同的Python版本中不一致。
我注意到在使用-m
选项调用脚本时,名称为__loader__
的变量会添加到命名空间中,因此在脚本的顶部可以检查该变量是否存在: / p>
if '__loader__' in globals():
# called with -m
为了更加安全,您可以查看__loader__
是pkgutil.ImpLoader
的实例:
if '__loader__' in globals() and __loader__.__class__.__name__ == 'ImpLoader':
答案 1 :(得分:2)
另一个观察结果是,在使用__package__
时,None
在直接执行脚本时设置为-m
,在设置包名称时设置为None
(当模块未包含在模块中时使用空字符串任何包,所以它仍然不同于{{1}})。