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

问题描述 投票:0回答:1

我不熟悉构建软件包,所以请多多包涵。我在导入最新的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 __。pyfrom .functions_a import *

subpackage_b / __ init __。pyfrom .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文件?我究竟做错了什么 ?

python-3.x pip package virtualenv init
1个回答
0
投票

setuptools.setup不知道subpackage_asubpackage_b存在。您仅指定了顶层package。因此,它不会在安装中包括这些子软件包。相反,您还应该指定它们:

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

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

from setuptools import find_packages

setup(
    ...,
    packages=find_packages()
)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.