用pip安装软件包后无法导入子软件包

时间:2020-04-13 19:08:49

标签: python import module package setuptools

我有一个名为build-your-own-computer的项目,其结构如下:

build-your-own-computer
├── computer
│   ├── arithmetic
│   ├── __init__.py
│   ├── logic
│   └── memory
├── README.md
├── setup.py
├── setup.py~
├── solutions
│   ├── arithmetic
│   │   ├── half_adder.py
│   │   ├── __init__.py
│   │   └── __init__.py~
│   ├── __init__.py
│   ├── __init__.py~
│   ├── logic
│   │   ├── _and.py
│   │   ├── __init__.py
│   │   ├── __init__.py~
│   │   ├── _not.py
│   │   ├── _or.py
│   │   └── xor.py
│   └── memory
│       └── __init__.py
└── tests
    ├── arithmetic
    │   └── test_half_adder.py
    ├── logic
    │   ├── test_and.py
    │   ├── test_not.py
    │   ├── test_or.py
    │   └── test_xor.py
    └── memory

我的目标是能够使用pip安装此项目/软件包,然后在系统的任何位置使用它。我想这样导入包/模块:

from byoc.solutions.logic import _and
from byoc.computer.arithmetic import half_adder

据我了解,build-your-own-computer本身可以看作是一个包,build-your-own-computer\computer是一个子包,build-your-own-computer\computer\logic\是一个子子包。除 init .py之外的所有setup.py文件都是模块。这是正确的吗,上面的导入方案是否与此项目结构相对应?

所有__init__.py文件都是空的。

setup.py包含以下内容:

from setuptools import setup, find_packages

setup(
    name='byoc',
    packages=find_packages()
)

当我使用pip安装此组件,然后尝试导入子模块时,遇到了问题:

>>> from byoc.solutions.logic import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'byoc.solutions'

我可以无错误地导入byoc

我显然做错了,但是怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用setuptools检查here的建议布局。 here也是一个很好的指南。 这是我对您的布局的建议:

build-your-own-computer
├── README.md
├── setup.py
├── setup.cfg
├── src
│   └── byoc
│       ├── __init__.py
│       ├── computer
│       │   ├── arithmetic
│       │   ├── __init__.py
│       │   ├── logic
│       │   └── memory
│       └── solutions
│           ├── arithmetic
│           │   ├── half_adder.py
│           │   └── __init__.py
│           ├── __init__.py
│           ├── logic
│           │   ├── _and.py
│           │   ├── __init__.py
│           │   ├── __init__.py~
│           │   ├── _not.py
│           │   ├── _or.py
│           │   └── xor.py
│           └── memory
│               └── __init__.py
└── tests
    ├── arithmetic
    │   └── test_half_adder.py
    ├── logic
    │   ├── test_and.py
    │   ├── test_not.py
    │   ├── test_or.py
    │   └── test_xor.py
    └── memory

然后您的setup.py应该是:

from setuptools import setup, find_packages

setup(
    name='byoc',
    packages=find_packages('src/')
    package_dir={'': 'src/'},
)

这样,您应该可以将其导入到任何地方,例如:

from byoc.solutions import logic