如何防止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
doimport-somemorecode
或import-repo2.somemorecode
,同样地,somemorecode.py
doimport-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
doimport-somemorecode
或import-repo2.somemorecode
,同样地,somemorecode.py
doimport-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”的模块