【发布时间】:2021-03-28 16:44:12
【问题描述】:
如何从main的子包中导入模块,以便在本地项目目录和pip安装程序时都导入正确的文件?
让我们看一下项目目录的典型结构。
spam
└── spam
├── egg
│ ├── egg.py
│ └── __init__.py
├── bacon
│ ├── bacon.py
│ └── __init__.py
├── __init__.py
└── main.py
主要我想导入egg 和bacon。
现在我用
from egg import egg
from bacon import bacon
当我使用python main.py 在项目目录中运行程序时,这可以正常工作。
但是,在使用 pip 安装程序并在任何非项目目录中运行它后,我会得到以下信息:No module named 'egg'。
为了使它工作,我需要:
from spam.egg import egg
from spam.bacon import bacon
但是,这种方法有一个重要缺点。 现在,如果我在本地运行程序,模块是从 pip 安装中导入的,而不是从本地项目目录中导入的。
我尝试过类似的相对导入:
from .egg import egg
或
from ..egg import egg
但他们返回ImportError: attempted relative import with no known parent package。
我检查了 GitHub 上的几个项目,看看人们是如何做到这一点的,结果发现他们都使用from spam.egg import egg 方法。
我怀疑这是正确的方法。
如果项目中的 shell 运行了一些测试,它们可能会错误地通过或失败,因为正在使用 pip 安装的模块,而不是本地模块。
【问题讨论】: