将包作为脚本运行:执行__main__.py而不导入__init__.py

时间:2016-08-29 14:46:31

标签: python package

我的包目录如下:

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成为安装脚本的入口点。

1 个答案:

答案 0 :(得分:2)

你不能。 __init__是软件包的核心,并且始终可以从软件包中导入任何内容。

您必须将代码从__main__.py移到套餐外,或将您不希望执行的代码从__init__.py移到另一个模块。