问题描述
如何处理使用绝对导入并具有相同文件夹和文件名的多个项目的导入?
我正在处理 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 都需要不同的路径才能找到自己的 util!
这里真正的解决方案是什么?我知道如果在 version1 和 version2 文件中使用了相对导入(不是我编写的),那会很容易。我也知道如果我只使用两者中的一个,只需给出 PYTHONPATH=/path/to/myproject:/path/to/myproject/third_party/version1
会很容易,一切都会好起来的。但我想同时使用两者。在理想情况下,我不会对版本 1 和版本 2 中的代码进行太多更改或根本不更改。
我希望我能做的是完全封装 version1 和 version2 代码,当运行时,他们神奇地知道在哪里寻找自己的文件。我尝试使用 setuptools
但我仍然遇到路径问题。我怀疑 bazel 可以以某种方式用于此目的?
附言使用 python 3
p.p.s.我上传了一个 demo on gh here
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)