如何在没有 sys.path.append 的情况下在 Python 中进行相对导入,既没有 -m falg 也没有 __init__.py 文件?
How to do relative imports in Python without sys.path.append neither -m falg neither with __init__.py file?
我知道 python 机制不允许在没有已知父包的情况下进行相对导入,但我想知道原因是什么。
如果相对导入在没有已知父包的情况下工作,这将使开发人员的生活更加轻松(我认为,如果我错了请纠正我)
示例:
必须从 python 脚本导入全局定义文件。现在我必须这样做:
DEFS_PATH = '../../../'
sys.path.append(DEFS_PATH)
import DEFINITIONS as defs
如果我可以像这样导入这个文件而不必在执行脚本或创建一个收集所有包的 __init__.py
文件时指定 -m
标志。这会让一切变得更容易。
from .... import DEFINITIONS as defs
当然这样做会引发著名的导入错误:
显然这是一个玩具示例,但想象一下必须在数百个 python 脚本中重复此操作...
在没有已知父包的情况下 导入相关包 是否有任何变通方法,不涉及 hacky 丑陋的方式(sys.path.append(...)
或 python -m myscript
) ?
我用不同的方式解决了这个问题。我有一个文件夹,其中有很多我在不同包中使用的全局函数,我可以创建一个 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
),文件内的路径应该用回车 return ("\n") 分隔。另外,路径应该是绝对的。
例如:
C:\path\to\utils1
C:\path\to\other\utils2
我知道 python 机制不允许在没有已知父包的情况下进行相对导入,但我想知道原因是什么。
如果相对导入在没有已知父包的情况下工作,这将使开发人员的生活更加轻松(我认为,如果我错了请纠正我)
示例:
必须从 python 脚本导入全局定义文件。现在我必须这样做:
DEFS_PATH = '../../../'
sys.path.append(DEFS_PATH)
import DEFINITIONS as defs
如果我可以像这样导入这个文件而不必在执行脚本或创建一个收集所有包的 __init__.py
文件时指定 -m
标志。这会让一切变得更容易。
from .... import DEFINITIONS as defs
当然这样做会引发著名的导入错误:
显然这是一个玩具示例,但想象一下必须在数百个 python 脚本中重复此操作...
在没有已知父包的情况下 导入相关包 是否有任何变通方法,不涉及 hacky 丑陋的方式(sys.path.append(...)
或 python -m myscript
) ?
我用不同的方式解决了这个问题。我有一个文件夹,其中有很多我在不同包中使用的全局函数,我可以创建一个 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
),文件内的路径应该用回车 return ("\n") 分隔。另外,路径应该是绝对的。
例如:
C:\path\to\utils1
C:\path\to\other\utils2