如何知道python脚本是否使用解释器的-m选项运行?

时间:2011-12-01 21:45:25

标签: python command-line

阅读完所有内容后,我找不到答案:

理由:
如果在没有-m选项的情况下运行使用相对导入的测试脚本,我可以打印警告消息,而不是让用户使用标准回溯导致ValueError: Attempted relative import in non-package异常。在不知情的情况下,我可以捕获此异常并且只有建议缺少-m选项可能是错误的原因。

2 个答案:

答案 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}})。