我有一个名为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
。
我显然做错了,但是怎么办?
答案 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