【问题标题】:sys.path.append, how to resolve name collisions when you cannot modify modulessys.path.append,当您无法修改模块时如何解决名称冲突
【发布时间】:2023-08-11 13:16:01
【问题描述】:

我正在尝试将两个 Django 模块(1.4 版)的位置附加到我的 PYTHONPATH 以使用它们的 ORM 模型。代码如下:

sys.path.append('/path/project1')
sys.path.append('/path/project2')

当我尝试如下设置 Django 环境时:

import settings 
setup_environ(settings)

仅加载project1 的设置。我认为问题在于两个模型分别包含一个名为settings.py 的文件,因此名称冲突。我无法修改模块。

如何将两个模块设置添加到 Django 环境中?

【问题讨论】:

  • “我不能修改模块”你的意思是你不能重命名它们?为什么?
  • 不,我不能因为遗留原因。还有很多其他程序依赖于这些模块,所以我不能在不破坏其他依赖关系的情况下重命名它们的文件。
  • 你确定你真的需要两个项目同时在一个解释器中工作吗?
  • 是的,我很确定
  • 我谈到的解决方案是创建一个新的 settings.py,它会自动加入其他两个设置文件,因为 Djando 不允许使用两个设置文件。问题是我没有能力以通用的方式进行操作(我不知道大多数设置的作用)。我要删除我的答案。

标签: python django pythonpath


【解决方案1】:

注意:

我取消删除此答案以供将来参考。下面的解决方案允许从同名文件中导入两个不同的模块,但不允许在一个解释器中运行两个 Django 项目(参见this commentthis comment)。

解决方案 #1

您可以尝试将项目转换为 python 包。
1.在/path/project1/和/path/project2/中添加一个空的__init__.py
2.

sys.path.append('/path/')
sys.path.append('/path/project1/')
sys.path.append('/path/project2/')

import project1.settings
import project2.settings 
setup_environ(project1.settings)
setup_environ(project2.settings)

解决方案 #2

1) 在 /path/ 中创建一个目录,其中包含指向设置文件的符号链接

cd /path/
mkdir setting_links
cd setting_links
ln ../project1/settings.py settings_1.py
ln ../project2/settings.py settings_2.py

2) 将两个项目和目录放到sys.path

sys.path.append('/path/setting_links/')
sys.path.append('/path/project1/')
sys.path.append('/path/project2/')

import settings_1
import settings_2
setup_environ(settings_1)
setup_environ(settings_2)

【讨论】:

  • 它可以工作,但我仍然遇到项目模块内的相对导入问题。让bazfoo 成为project1 的子模块,例如project1.foo.bar。当我尝试from project1.foo import bar 之类的东西时,我收到一个错误,因为在bar 内部有from foo import blahblah 之类的导入。错误是ImportError: No module named foo
  • @superciccio14 首先想到的是使用from project1.foo import blahblah 而不是from foo import blahblah。它会让事情变得过于复杂吗?
  • 我刚刚测试过。这两种解决方案都可以在我的计算机上使用 python 2 和 3 工作。
  • @superciccio14 好的。我认为这个问题可以只用我的 python 知识来解决,但我正在阅读 Django 代码。顺便说一句,您使用的是什么版本的 Django?
  • @superciccio14 实际上,如果您的其余代码与 1.7 兼容,切换可能是一个更好的主意。另外我想现在我想出了一个应该与 Django 1.4 - 1.10+ 兼容的解决方案。我要安装django,看看它是否真的有效。