【问题标题】:subpackages can't be imported after package installed with pip使用 pip 安装包后无法导入子包
【发布时间】:2020-04-21 04:43:39
【问题描述】:

我有一个名为 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\ 是一个子子包。除了 initsetup.py 之外的所有 .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

我显然做错了什么,但是什么?

【问题讨论】:

  • 我要测试的第一件事是,“本地”完成所有导入工作。也就是说,我将PYTHONPATH=.cd设置为byoc存在的目录,然后测试导入它,导入子模块。
  • 但是byoc 甚至没有在您的项目结构中定义(我没有看到名为byoc 并包含__init__.py 的目录)。怎么可能导入? 据我了解,build-your-own-computer 本身可以被视为一个包 不,build-your-own-computer 是包含您的项目的目录。包是computersolutions,例如from computer import logic 应该可以工作。如果你想要一个byoc 包,请在你的项目目录中创建它,然后将computerlogic 移到其中。

标签: python import module package setuptools


【解决方案1】:

您可以通过 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

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多