python - 如何在没有 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
)?
解决方案
我以不同的方式解决了这个问题。我有一个文件夹,其中有许多在不同包中使用的全局函数,我可以创建这个文件夹的 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
推荐阅读
- java - 如何解决 com.mongodb.spark.exceptions.MongoTypeConversionException:无法转换... Java Spark
- jquery - angular 7中iframe的浏览器后退按钮问题
- typescript - typescript null 安全运算符错误。我正在使用 mac 和 visul 代码
- swift - Swift:NSTableView拖动以重新排序项目如何在拖动过程中显示单元格
- java - 从流中获取副本而不消耗原始流
- go - 需要一点帮助来理解代码流程?我不明白输出中的routine-end 是如何出现在其他输出语句之间的
- java - 如何在 Gradle 插件中为 sourceSets 块编写测试
- java - 使用 Java (HttpURLConnection) 的 400 错误 Paypal 令牌 API
- laravel - Laravel 7 Socialite Google 登录显示无效的授权错误
- java - 有没有办法在 Eclipse 中评论/取消评论 VM 参数?