首页 > 解决方案 > 如何在没有 sys.path.append 的 Python 中进行相对导入,既没有 -m falg 也没有 __init__.py 文件?

问题描述

我知道python机制不允许在没有已知父包的情况下进行相对导入,但我想知道原因是什么。

如果相对导入在没有已知父包的情况下工作,它将使开发人员的生活更加轻松(我想,如果我错了,请纠正我)

例子:

从 python 脚本中必须导入一个全局定义文件。现在我必须这样做:

DEFS_PATH = '../../../'
sys.path.append(DEFS_PATH)
import DEFINITIONS as defs

如果我可以像这样导入这个文件,而不必-m在执行脚本或创建一个__init__.py收集所有包的文件时指定标志。这将使一切变得更加容易。

from .... import DEFINITIONS as defs

当然,这样做会引发著名的导入错误: 导入错误

显然这是一个玩具示例,但想象一下必须在数百个 python 脚本中重复这个......

是否有任何解决方法可以在没有已知父包的情况下导入相关包,并且不涉及 hacky 丑陋的方式(sys.path.append(...)python -m myscript)?

标签: pythonpython-import

解决方案


我以不同的方式解决了这个问题。我有一个文件夹,其中有许多在不同包中使用的全局函数,我可以创建这个文件夹的 Python 包,但是每次更改某些内容时都必须重新构建它。

适合我的解决方案是在我当前环境user-packages.pth的目录中添加文件site-packages,但它也可以添加到全局site-packages文件夹中。在user-packages.pth其中,我添加了所有全局工具所在目录的绝对路径。现在我只需要使用任何 python 脚本

from utils import data_processing as dp
from utils.database import database_connection as dc

现在我不需要在每个文件中添加 sys.path.append("path/to/myutils/")


笔记:

.pth文件可以具有任何文件名 ( customName.pth),并且文件内的路径应由回车符 ("\n") 分隔。此外,路径应该是绝对的。

例如:

C:\path\to\utils1
C:\path\to\other\utils2

推荐阅读