我试图运行一个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
到目前为止,我曾经改变过这条线路。基于我目前需要做的事情 我该怎么做才能解决这个问题?
答案 0 :(得分:1)
两种解决方案:将manage.py
移至code
(推荐)。
或:使用python -m django_proj.manage
。
无论您选择什么,您都必须将所有相对进口变为绝对进口。也就是说,从django_proj.settings
到django_proj.django_proj.settings
。
相对进口是令人讨厌的,并导致你现在遇到的那种问题。 (这就是从Python 3中删除相对导入的原因。)
有关详细信息,请参阅this answer中的Martijn Pieters。
我现在看到您的code
有一个__init__.py
。真的需要吗?如果没有,请将其删除。如果需要,那么即使使用我的解决方案,您仍将使用相对于code
的导入。
这意味着您必须将所有脚本移出code
,并使用code
为所有导入添加前缀。