【问题标题】:ImportError in running django from twisted从 twisted 运行 django 时出现 ImportError
【发布时间】:2015-05-09 19:25:58
【问题描述】:

我正在尝试运行一个 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 运行某些东西时,比如运行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

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

【问题讨论】:

    标签: python django twisted python-import


    【解决方案1】:

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

    或者:使用python -m django_proj.manage

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

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

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


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

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

    【讨论】:

    • 第二条路:它给了我ImportError: No module named settings
    • 第一种方式也是如此。
    • 谢谢@Andrea!在manage.py 中更改设置导入并通过python -m 运行就可以了!
    • 我个人认为第二种方式更好,因为它不会破坏 django 应用程序结构,并且不会使用 django 应用程序的实用程序污染code 文件夹。您能否详细说明一下为什么推荐第一种方式?
    • @sazary:因为python -m django_proj.manage 不是“显而易见的”,人们可能会想运行python manage.py
    猜你喜欢
    • 2019-01-05
    • 2014-05-07
    • 2020-09-10
    • 2012-06-14
    • 1970-01-01
    • 2021-06-26
    • 2023-01-16
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多