我不熟悉构建软件包,所以请多多包涵。我在导入最新的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_a
和subpackage_b
存在。您仅指定了顶层package
。因此,它不会在安装中包括这些子软件包。相反,您还应该指定它们:
setup(
...,
packages=['package', 'subpackage_a', 'subpackage_b']
)
此过程可以通过find_packages()
自动执行:
from setuptools import find_packages
setup(
...,
packages=find_packages()
)