首页 > 解决方案 > 在 python 中导入子包的问题:我应该如何编写 __init__.py 文件

问题描述

我是构建软件包的新手,所以请耐心等待。我在导入我最新的 python 项目的子包时遇到问题。

我的目录结构如下:

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

文件如下所示

设置.py:

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

包/__init__.py:空。

subpackage_a/__init__.pyfrom .functions_a import *

subpackage_b/__init__.pyfrom .functions_b import *

函数_a.py

包含

def hello_world_a():

    print('hello its a')

functions_b.py包含

def hello_world_b():

    print('hello its b')

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

from package.subpackage_a import hello_world_a 

ModuleNotFoundError: No module named 'package.subpackage_a'

subpackage_b 也是如此。但是如果我导入包,这是可以识别的。我有一种感觉,这种方法曾经有效,因为我有一些以这种方式编写的旧包不再有效。

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

标签: python-3.xpippackagevirtualenvinit

解决方案


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

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

这个过程可以通过以下方式自动化find_packages()

from setuptools import find_packages

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

推荐阅读