我的包目录如下:
foo/
__init__.py
__main__.py
setup.py
如果重要,我使用setuptools安装它。
现在,如果我有一行代码为import foo
的Python代码,则执行__init__.py
并且不执行__main__.py
。这很好。
但如果我运行命令python -m foo
,则执行__init__.py
和__main__.py
。我希望在没有__main__.py
的情况下执行__init__.py
。
我该如何实现?
如果python foo
在我的工作目录中运行foo
,我会有所需的行为。但是,当我从其他目录运行命令时,这不再起作用(我有错误No such file or directory
,如预期的那样)。
背后的动机是foo
是一个依赖于某个共享C库(称之为c_foo
)的库。如果您的系统上不存在foo
,则无法导入c_foo
(它会引发异常)。我不想使用setup.py自动安装c_foo
,因为它可能是共享的,或者用户可能希望进行自定义安装。但是,我想在foo
中嵌入安装脚本,以帮助用户在需要时安装c_foo
。所以我希望python -m foo
成为安装脚本的入口点。
答案 0 :(得分:2)
你不能。 __init__
是软件包的核心,并且始终可以从软件包中导入任何内容。
您必须将代码从__main__.py
移到套餐外,或将您不希望执行的代码从__init__.py
移到另一个模块。