在 python 中导入子包时出现问题:我应该如何编写 __init__.py 文件

problems importing sub packages in python: how should I write the __init__.py files

我是构建包的新手,请多多包涵。我在导入最新 python 项目的子包时遇到问题。

我的目录结构如下:

├── package
│   ├── __init__.py
│   ├── subpackage_a
│   │   ├── __init__.py
│   │   └── functions_a.py
│   └── subpackage_b
│       ├── __init__.py
│       └── functions_b.py
└── setup.py

文件如下所示

setup.py :

from setuptools import setup
setup(name='test_package',
      version='0.3',
      description='',
      author='me',
      packages=['package']
      )

package/__init__.py: 空.

subpackage_a/__init__.py: from .functions_a import *

subpackage_b/__init__.py: from .functions_b import *

functions_a.py

包含

def hello_world_a():

    print('hello its a')

functions_b.py包含

def hello_world_b():

    print('hello its b')

现在我打开 virtualenv 进入 setup.py 的目录,然后我 pip install .。我期望访问子包 a 和 b 中包含的功能。但是当我尝试导入函数时,我得到一个模块未找到错误。

from package.subpackage_a import hello_world_a 

ModuleNotFoundError: No module named 'package.subpackage_a'

同样的事情也适用于 subpackage_b。但是,如果我导入包,这是可以识别的。我觉得这种方法曾经有效,因为我有一些以这种方式编写的旧软件包不再有效。

也许我必须更改我的 init.py 文件?我究竟做错了什么 ?

setuptools.setup 不知道 subpackage_asubpackage_b 存在。您只指定了顶级 package。所以它不会在安装中包含这些子包。相反,您还应该指定它们:

setup(
    ...,
    packages=['package', 'subpackage_a', 'subpackage_b']
)

这个过程可以通过find_packages()自动执行:

from setuptools import find_packages

setup(
    ...,
    packages=find_packages()
)