2015-05-09 370 views
1

我试图运行一个扭曲的程序,它提供一些请求,并通过WSGI运行一个Django应用程序,并向它发送一些请求。文件夹结构是这样的:从扭曲运行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 

所以到现在为止,我用来改变此行回&提出基于我所需要的那一刻做。
我该怎么做才能解决这个问题?

回答

1

两种解决方法:将manage.py移至code(推荐)。

或者:使用python -m django_proj.manage

无论您选择什么,您都必须将所有相对进口更改为绝对进口。也就是说,从django_proj.settingsdjango_proj.django_proj.settings

相对进口是讨厌的,并导致你现在遇到的那种问题。 (这是为什么相对进口已从Python 3中删除的原因。)

有关更多信息,请参阅this answerMartijn Pieters


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

这意味着您必须将所有脚本移出code,并将所有导入的前缀都用code加上前缀。

+0

第二种方式:它给了我'ImportError:没有模块命名设置' – sazary

+0

第一种方式也是这样说的。 – sazary

+0

@sazary:更新回答 –