首页 > 解决方案 > 如何处理使用绝对导入并在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 的演示

标签: pythonpython-importsetuptoolsbazelpythonpath

解决方案


推荐阅读