我需要为 django 编写一些脚本,并尝试在每个脚本的开头设置 DJANGO_SETTINGS_MODULE 环境变量。脚本、
manage.py
和myproject
目录位于同一父目录中。此外,settings.py
文件位于myproject
目录中。
因此,以下代码可以正常工作
#test_script_header.py
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
import django
django.setup()
但是下面的代码不起作用
#test_script_header.py
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "/home/<username>/workspace/djangoapp/src/myproject/settings.py"
import django
django.setup()
我收到错误
ModuleNotFoundError: No module named '/home/<username>/workspace/djangoapp/src/myproject/settings.py'
这是完整的错误消息
Traceback (most recent call last):
File "/home/<username>/workspace/djangoapp/src/test_script_header.py", line 22, in <module>
django.setup()
File "/usr/lib/python3/dist-packages/django/__init__.py", line 19, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 82, in __getattr__
self._setup(name)
File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 69, in _setup
self._wrapped = Settings(settings_module)
File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 170, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named '/home/<username>/workspace/djangoapp/src/myproject/settings'
但是,我想最终将所有 django 脚本移动到
myproject/scripts
目录并从那里执行它们。
我做错了什么?
当您在目录中运行此命令时:
python test_script_header.py
脚本的目录会自动添加到
sys.path
前面。因此,如果目录的形式为:
myproject
|- test_script_header.py
|- myproject
|- settings.py
您可以使用
Python 路径语法正确访问
settings
模块。
os.environ["DJANGO_SETTINGS_MODULE"] = "myproject.settings"
Django 可以正确定位该模块并读取所有
settings
变量。
但是如果
settings
模块不在脚本目录中,则必须添加其所在目录的确切路径,以便 Python 能够正确找到该模块。
例如,如果设置模块位于目录中:
/home/<username>/workspace/djangoapp/src/myproject/
将此目录添加到
sys.path
,以便Python在使用Python路径语法时可以正确定位该模块。
import sys
import os
import django
sys.path.insert(0, "/home/<username>/workspace/djangoapp/src/myproject/")
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
django.setup()