我想将调用 Python 包的外部脚本集成到包本身中,以便它可以使用“python3 -m mypackage”运行。问题是脚本在实际导入包之前做了一些内务处理。具体来说,它设置了一些环境变量,并调用具有特定参数的子模块。mypackage/__init__.py
有这样的:
from . import mysubmodule
if we_are_not_called_via_runpy:
mysubmodule.init()
mypackage/__main__.py
看起来像这样:
import os
os.environ['FOO'] = 'bar'
from . import mysubmodule
mysubmodule.init('veryspecial')
为了完整起见,一个简单的mypackage/mysubmodule.py
:
import os
def init(s=None):
print(os.environ.get('FOO'))
print(s)
我想要,当包正常导入时:
>>> import mypackage
None
None
但是通过runpy运行时:
$ python3 -m mypackage
bar
veryspecial
所以我基本上需要一个开关,无论__init__.py
是通过普通导入还是通过runpy调用。一个区别是 check sys.argv[0] == "-m"
,但这看起来像一个粗略的 hack:如果 mypackage 由使用此参数的程序导入会发生什么?此外,当通过 setup.cfg 中的入口点启动时,sys.argv[0]
情况也不同。