我正在尝试将位于另一个文件夹中的函数导入到位于另一个文件夹中的 python 文件中。
文件夹结构如下
Project:
-dbNameFolder
+ __init__.py
+ dbNames.py
-FolderIwantToImportTo
+ file.py
例如,我尝试使用基本的添加功能
def Add(a,b):
return (a+b)
并像这样导入它
from solve.basic import Add
注意:我从一个文件夹导入另一个文件夹而不是项目的根目录
我收到一个错误,说找不到该函数,我尝试使用 sys 但它只能在 vscode 中工作,如果我在 pycharm 中执行它,我会收到错误。
例如,我尝试使用基本的添加功能
def Add(a,b):
return (a+b)
并像这样导入它
from solve.basic import Add
为此,
solve
父包必须位于 sys.path 中。
确定性修复这些问题的正确方法是将您的项目转换为真正的包,然后在开发环境中将其安装为“可编辑包”:然后将所有源代码包从磁盘中的位置导入到 Python ,任何修改都会自动记入帐户。
即使代码不打算复制到或安装在另一台计算机或目录中,这也可以解决很多令人头疼的问题。
最小包安装的现代方法是在项目文件夹上方的文件夹中放置
pyproject.toml
文件 - 它可以相当小,并使用传统的 setuptools
堆栈。然后,在该文件夹上,运行命令 pip install -e .
并激活你的工作 Python(virtualenv、系统 Python、其他自定义安装等...)。在 IDE 中,这意味着转到 IDE 本身提供的终端并键入该命令(在操作系统 shell 上,而不是在 Python(>>>
提示符)shell 中)。
允许此操作的最小 pyproject.toml 文件是:
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "solve"
version = "1.0"
[tool.setuptools]
packages = ["solve"]
然后
pip install -e .
在该文件所在的文件夹上。
(这不需要包子文件夹中的任何
__init__.py
文件即可工作。较旧的 Python 需要这样的文件,即使它是空的(0 字节))
这甚至允许相对导入 - 例如,在
solve/data/dbfile.py
您可以做的文件from ..basic import Add
如果您不想处理
pip install
(您确实应该这样做),则可以使用的“不正确”方法是将包含 solve
本身的文件夹添加到您的 sys.path
文件夹列表中。这可以在项目的入口点完成一次。假设您有一个 solve/__init__.py
文件 - 您可以将其包含在其中:
from pathlib import Path
import sys
package_path = str(Path(__file__).parent.parent)
sys.path.insert(0, package_path)
# from here on, "import solve. ..." will work
# (but check the note on the `__init__.py` files above)