如何处理使用绝对导入并在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 都需要不同的路径才能找到自己的 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...