来自 twisted 的 运行 django 中的 ImportError

ImportError in running django from twisted

我正在尝试 运行 一个 Twisted 程序,它服务于一些请求,并且还 运行 通过 WSGI 是一个 Django 应用程序,并将一些请求路由到它。文件夹结构是这样的:

code
  |-- __init__.py
  |-- main.py
  |-- django_proj
  |     |-- __init__.py
  |     |-- manage.py
  |     |-- django_proj
  |     |     |-- __init__.py
  |     |     |-- settings.py
  |     |     |-- ...
  |     |-- django_app
  |     |     |-- __init__.py
  |     |     |-- models.py
  |     |     |-- ...

现在,在 django_proj/django_proj/settings.py 我有这行:

INSTALLED_APPS = (
    ...
    'django_proj.django_app',
    ...
)

和我 运行 当我在 code 文件夹中时的程序是这样的:python ./main.py,它 运行 没有问题。但是当我需要 运行 一些东西和 manage.py 时,比如 运行ning manage.py migrate 我需要进入 code/django_proj 文件夹和 运行 它;但随后它说:

ImportError: No module named django_app

我需要将 INSTALLED_APPS 中的行更改为:

INSTALLED_APPS = (
    ...
    'django_app',
    ...
)

但如果我就这么放着,我就不能运行python ./main.py!因为它会说:

ImportError: No module named django_app

所以到目前为止,我常常根据我当时需要做的事情来回更改这条线。
我应该怎么做才能解决这个问题?

两种解决方案:要么将 manage.py 移动到 code(推荐)。

或者:使用python -m django_proj.manage.

无论您选择什么,都必须将所有相对导入更改为绝对导入。即从django_proj.settingsdjango_proj.django_proj.settings.

相对导入很讨厌,会导致您现在遇到的那种问题。 (这就是从 Python 3 中删除相对导入的原因。)

有关详细信息,请参阅 this answer from Martijn Pieters


我现在看到你的 code 有一个 __init__.py。真的需要吗?如果没有,请将其删除。如果需要,即使使用我的解决方案,您仍然会使用相对于 code 的导入。

这意味着您必须将所有脚本移出 code,并为所有导入添加前缀 code