如何防止Python将同名子目录混用?

如何防止Python将同名子目录混用?,python,import,directory,pythonpath,Python,Import,Directory,Pythonpath,我有一个应用程序,它被设计成一种包装器,用于运行许多开源存储库,然后可视化它们的结果 项目布局的相关部分如下所示: project/ |--repos/ |--repo1/ |--utils/ |--somecode.py |--repo2/ |--utils/ |--somemorecode.py |--myapp/ |--main.py 作为我的应用程序入口点的文件是myapp中的main.py。这将调用somecode.p

我有一个应用程序,它被设计成一种包装器,用于运行许多开源存储库,然后可视化它们的结果

项目布局的相关部分如下所示:

project/
|--repos/
   |--repo1/
      |--utils/
      |--somecode.py
   |--repo2/
      |--utils/
      |--somemorecode.py
|--myapp/
   |--main.py
作为我的应用程序入口点的文件是myapp中的main.py。这将调用somecode.py和somemorecode.py中包含的方法,这些方法返回结果

我遇到的问题是Python正在查看错误的utils文件夹,因此导入失败。例如,当我将函数从somemorecode.py导入main.py时,我要导入的文件会尝试访问repo1中的utils文件夹

到目前为止,我已经尝试修改PYTHONPATH,在运行时编辑sys.path(显然不推荐),但前者似乎无法解决问题,后者可能会出现缓存问题,因为必须在两个repo的代码之间快速切换

存储库是开源的GitHub repo,需要保持不变。这些不是作为包设置的,因为它们是作为自包含的应用程序使用的,但我将它们一起运行以进行比较。这两个repo都包含带有init.py文件的utils包


somecode.py使用导入,例如从utils.file导入函数导入
,somemorecode.py使用完全相同的导入类型,但应该访问repo2的utils文件夹。

您可以使用
作为关键字。它允许您为导入的模块/对象指定自定义名称

from repo1 import utils as repo1_utils
from repo2 import utils as repo2_utils
然后,只需访问您指定的新名称即可调用您需要的功能:

repo1_utils.some_function()

您可以将
用作
关键字。它允许您为导入的模块/对象指定自定义名称

from repo1 import utils as repo1_utils
from repo2 import utils as repo2_utils
然后,只需访问您指定的新名称即可调用您需要的功能:

repo1_utils.some_function()

其他代码是如何导入UTIL的?请您澄清您的问题是什么,最好是通过?能否请您澄清
repo1
repo2
utils
是包还是文件夹,以及实际运行的导入是什么?具体来说,
main.py
do
import-somemorecode
import-repo2.somemorecode
,同样地,
somemorecode.py
do
import-utils
import-repo2.utils
from。导入UTIL
?请注意,如果
repo1
repo2
假定具有顶级包
UTIL
,则它们将被破坏。最好的做法是修复它们,最好是在源存储库中。如果您确实需要两者共存于同一应用程序中,则在导入每个回购之前修改
sys.path
sys.modules
,前提是回购代码不检查导入机器或动态导入。或者,如果
utils/\uuuu init\uuuuuuupy
都不包含代码,并且
utils
中没有名称冲突,则删除
utils/\uuuuuuu init\uuuuuupy
会将两个文件夹合并为一个名称空间包。与前面的建议一样,这在很大程度上取决于
repo1
/
repo2
的表现如何。其他代码是如何导入UTIL的?请您澄清您的问题是什么,最好是通过?能否请您澄清
repo1
repo2
utils
是包还是文件夹,以及实际运行的导入是什么?具体来说,
main.py
do
import-somemorecode
import-repo2.somemorecode
,同样地,
somemorecode.py
do
import-utils
import-repo2.utils
from。导入UTIL
?请注意,如果
repo1
repo2
假定具有顶级包
UTIL
,则它们将被破坏。最好的做法是修复它们,最好是在源存储库中。如果您确实需要两者共存于同一应用程序中,则在导入每个回购之前修改
sys.path
sys.modules
,前提是回购代码不检查导入机器或动态导入。或者,如果
utils/\uuuu init\uuuuuuupy
都不包含代码,并且
utils
中没有名称冲突,则删除
utils/\uuuuuuu init\uuuuuupy
会将两个文件夹合并为一个名称空间包。与前面的建议一样,这在很大程度上取决于
repo1
/
repo2
的表现。不幸的是,这并不能解决我的问题,因为是repo中的导入导致了问题,而我不允许编辑这些导入。例如,utils.file导入函数1中的
,函数2
导致
没有名为“utils.file”的模块
,不幸的是,这并不能解决我的问题,因为是回购协议中的导入导致了问题,而我不允许编辑这些导入。例如,
从utils.file导入函数1,函数2
导致
没有名为“utils.file”的模块