python-3.x - 在 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__.py:from .functions_a import *
subpackage_b/__init__.py:from .functions_b import *
函数_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()
)
推荐阅读
- byobu - byobu:如何将状态行位置从“底部”更改为“顶部”?
- angular - 角材料对话框不显示正确的信息
- java - 为什么 Hibernate 会尝试删除关联对象?
- javascript - 如何仅使用单个数组在 JavaScript 中模拟调用堆栈
- java - 如何等待项目完成加载?
- amazon-web-services - ebextension 脚本中的参考环境属性
- nginx - 如何使用 Nginx 服务 Senaite LIMS (Plone 4.3.19)?
- excel - 跨多列的 Excel 中位数
- regex - 如果不是特定短语的一部分,则正则表达式匹配单词
- excel - Excel:仅在与名称匹配的行中计算带有“Apple”的单元格