【问题标题】:How to do relative imports in Python without sys.path.append neither -m falg neither with __init__.py file?如何在没有 sys.path.append 的 Python 中进行相对导入,既没有 -m falg 也没有 __init__.py 文件?
【发布时间】:2021-02-19 18:54:22
【问题描述】:

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

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

示例:

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

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

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

from .... import DEFINITIONS as defs

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

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

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

【问题讨论】:

  • “为什么会发生 X?”和“X 有解决方法吗?”是两个完全不同的问题(第一个是often off-topic here)。
  • 让父包为人所知。只需在每个包和子包中添加一个__init__.py 文件即可。
  • @CharlesDuffy 谢谢查尔斯,刚刚编辑了问题
  • @Seth 是的,我知道,但是还有另一种不涉及重复 __init__.py 文件的方法吗?刚刚编辑了问题
  • 在任何应该被视为 Python 包的东西中对__init__.py 文件的要求让我觉得非常很有根据;否则,您可能会搜索到目录树中完全不相关的部分。请记住,并非所有 Python 模块都存在于磁盘目录中。边界条件变得很奇怪。当从鸡蛋或 zip 文件中导入某些内容并使用 .. 退出时,您期望会发生什么?与其冒险做出意想不到的事情,不如直接拒绝。

标签: python python-import


【解决方案1】:

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

适合我的解决方案是在我当前环境的site-packages 目录中添加user-packages.pth 文件,但也可以将它添加到全局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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2022-06-13
    • 2014-02-13
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多