Skip to main content
 首页 » 编程设计

python之Django 相对导入项目设置导致移动的 manage.py 文件出错

2025年05月04日46lori

按照此处答案中的目录结构:

Best practice for Django project working directory structure

在此处查看 GitHub 上的代码以进行故障排除:

django-start-template

我将 manage.py 移到了 scripts 目录中。我修改了 manage.py 和 wsgi.py 以包含这些行:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings") 

代替默认值:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings") 

我认为这基本上是等价的。

无论如何,这是我在运行 python manage.py runserver 时遇到的错误:

  File "C:\Users\ISH~1\DJANGO~1\lib\importlib\__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
  File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked 
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
  File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked 
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked 
ImportError: No module named '{{ project_name }}' 

我试过使用相对导入,但确实无法解决问题。作为新手,我确信答案很明显,但我花了几个小时阅读有关该问题的内容,但并没有真正取得任何进展。

有人建议添加 from . import * 但这只是导致:

Traceback (most recent call last): 
  File "manage.py", line 4, in <module> 
    from . import * 
SystemError: Parent module '' not loaded, cannot perform relative import 

virtualenv 处于事件状态,我从正确的目录运行 manage.py。当它不在 /scripts/ 中时工作正常。

编辑:

我没有提到这一点,但不管在 manage.py 中是否是:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings") 

或者:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name )).settings") 

结果始终是 ImportError: No Module named 'xyz'。在settings之前填写xyz。

此外,以上内容表明,我的项目并未像第一个链接中讨论的那样 100% 实现。我的 settings.py 仍然在默认位置。基本上看起来像这样:

~/projects/django-project 
 
/proj_dir 
    settings.py 
    urls.py 
    wsgi.py 
/scripts 
    manage.py 

此外,我尝试这样做是因为我认为它可能正在寻找 scripts 中的 proj_dir 而我实际上希望它上升到一个级别以寻找 proj_dir.

os.environ.setdefault("DJANGO_SETTINGS_MODULE", ".proj_dir.settings") 

这只会引发以下错误。

TypeError: the 'package' argument is required to perform a relative import for '.proj_dir.settings' 

那是我开始摆弄 import 和 from 的时候。 import 因为文档说错误与此有关。仍然无法解决问题。

请您参考如下方法:

如果您已将 manage.py 移动到 scripts 目录,则必须将父目录显式添加到 python 路径。

sys.path.append('..') 

不应更改设置 DJANGO_SETTINGS_MODULE 环境变量的行。保持原样

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings")