0

我想将调用 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]情况也不同。

4

0 回答 0