Python模块与软件包

时间:2019-06-11 02:36:22

标签: python import dependencies package

在Mac和Windows上运行python 3.7.3,同时解决了我的其他问题:

Cannot find submodule in a package on one PC but not on another PC

我已经阅读了许多有关软件包和模块的帖子,例如:

Can someone explain __all__ in Python?

但是,我仍然得到意想不到的结果。

我有一个包裹结构

pypkg/
    __init__.py
    src/
        __init__.py
        app.py
    util/
        __init__.py
        util.py

src / app.py的工作原理如下

# app.py

from pprint import pprint
import sys
pprint(sys.path, indent=4)

from util import *


def main():
    print('this is app.')
    util.func()
    pprint(sys.path, indent=4)


if __name__ == '__main__':
    main()

util / util.py看起来像这样

# util.py

def func():
    print('this is func from util.')

我希望坐在项目根目录下,即/path/to/pypkg/,我应该可以打电话:

python src/app.py

使其运行没有问题。

但是,它给了我

ModuleNotFoundError: No module named 'util'

然后我切换到运行状态

python -m src.app

这次我得到:

NameError: global name 'util' is not defined

最后,我将以下内容手动添加到util/__init__.py

__all__ = ['util']

这次运行正常。

根据经验我的假设:

  1. 仅当您使用带有-m选项的Python时,软件包依赖项才有效。
  2. 我最初对__init__.py可以为空的印象是一种误解。如果我要使用from <package> import *,则__init__.py必须定义__all__
  3. 使用软件包系统时,当前工作目录很重要。

我的问题:我的假设都正确吗?

如果我所有的假设都是正确的,那么使用带有代码库的程序包系统将很烦人,该代码库混合了应用程序代码和依赖项代码,通常您希望在任何地方进入命令行,只需调用{{ 1}}。但是软件包似乎不适用于这种范例。

现在我的下一个问题:

我应该以这种方式使用包裹吗?如果“包”本身包含应用程序代码,这是坚持使用旧的python random/relative/path/to/script.py黑客工具的最佳做法吗?

0 个答案:

没有答案