python - 如何处理使用绝对导入并在python中具有相同文件夹和文件名的多个项目?
问题描述
如何处理导入多个使用绝对导入并具有相同文件夹和文件名的项目?
我正在研究 ML 代码,其中许多作者编写的代码并不意味着是 pip 包,并且文件夹和文件名具有高度重叠,并且导入是绝对的,假设他们的代码的根是 PYTHONPATH 的根。设置是这样的:
myproject
myversion
mymodel.py
third_party
version1
model.py
util.py
version2
model.py
util.py
内容如下:
# myproject/third_party/version1/model.py
import util
def process(x):
return 2*util.preprocess(x)
# myproject/third_party/version2/model.py
import util
def process(x):
return 3*util.preprocess(x)
# myproject/third_party/version1/util.py
def preprocess(x):
return 1
# myproject/third_party/version2/util.py
def preprocess(x):
return 0
这就是我想要做的,例如,运行PYTHONPATH=/path/to/myproject myversion/mymodel.py
# myproject/myversion/mymodel.py
from third_party.version1.model import process as process1
from third_party.version2.model import process as process2
def myprocess(x):
return x
def compare(x):
return process1(x), process2(x), myprocess(x)
但是我被困住了,因为每个版本 1 和版本 2 都需要不同的路径才能找到自己的工具!
这里真正的解决方案是什么?我知道是否在 version1 和 version2 文件中使用了相对导入(不是我创作的),这很容易。我也知道如果我只使用两者中的一个,那么只要给予就会很容易PYTHONPATH=/path/to/myproject:/path/to/myproject/third_party/version1
,一切都会好起来的。但我想同时使用两者。在理想的世界中,我不会或根本不会更改 version1 和 version2 中的代码。
我希望我能做的是完全封装 version1 和 version2 代码,并且在运行时它们神奇地知道在哪里寻找自己的文件。我尝试使用setuptools
,但我仍然有路径问题。我怀疑 bazel 可以以某种方式用于此目的?
ps使用python 3
pps 我在这里上传了一个关于 gh 的演示
解决方案
推荐阅读
- generics - 除了使用带有相关常量的特征之外,还有一种更简单的方法来为通用结构配备常量吗?
- java - 如何在不使用任何“ButtonType”控件的情况下在 JavaFx 中创建自定义对话框?
- c++ - 如何在 C++ 中将文本文件的特定行读入 int 类型的数组?
- java - 如何在 Java 中捆绑 getter?
- php - 对 Laravel 查询构建器的 SQL 查询
- r - 将数据帧的每一列除以数据帧的一行
- vba - VBA 代码的结果在 Access 的文本框中不可见
- performance - Flutter:大画布的缩放会降低 FPS
- spring - Spring Data JPA:参数化@Query注解字符串,重构两个相似的@Query方法
- azure-cognitive-services - 如何以编程方式关闭沉浸式阅读器?