我有以下脚本,它意味着是一个独立的Django脚本,所以我可以从命令行运行python my_script.py
。它曾经与Django 1.8一起使用,在我升级到Django 1.11后,我收到以下错误:
Traceback (most recent call last):
File "app.py", line 8, in <module>
django.setup()
File "C:\python27\lib\site-packages\django-1.11.5-py2.7.egg\django\__init__.py", line 22, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
File "C:\python27\lib\site-packages\django-1.11.5-py2.7.egg\django\conf\__init__.py", line 56, in __getattr__
self._setup(name)
File "C:\python27\lib\site-packages\django-1.11.5-py2.7.egg\django\conf\__init__.py", line 41, in _setup
self._wrapped = Settings(settings_module)
File "C:\python27\lib\site-packages\django-1.11.5-py2.7.egg\django\conf\__init__.py", line 110, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "C:\python27\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
ImportError: Import by filename is not supported.
这是我的python脚本
# standalone django setup
import os, sys, logging, django
prj_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
logging.basicConfig(level=logging.INFO)
logging.info("PRJ_DIR: %s" % prj_dir)
sys.path.append(prj_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.settings" % prj_dir.split("/")[-1])
django.setup()
...
...
答案 0 :(得分:8)
在Windows上运行脚本时,您似乎试图通过正斜杠/
拆分文件路径,其中路径分隔符是反斜杠\
。使用os.path.basename
代替手动处理蜇伤(.split("/")[-1]
):
>>> import os
>>> os.path.basename(r'/home/user/project')
'project'
>>> os.path.basename(r'c:\users\user\project')
'project'
相比之下:
>>> r'/home/user/project'.split("/")[-1]
'project' # works
>>> r'c:\users\user\project'.split("/")[-1]
'c:\\users\\user\\project' # error
答案 1 :(得分:3)
不要重新发明轮子。 django扩展上有一个很酷的管理命令,可以让你在django上下文中运行脚本。
https://django-extensions.readthedocs.io/en/latest/runscript.html
答案 2 :(得分:1)
其他人已指出路径操作存在问题,但实际导入异常的原因是您将DJANGO_SETTINGS_MODULE
设置为文件名。
它必须是Python模块的名称。换句话说,您的设置文件应该以{{1}}结尾,您应该传递它的名称(没有.py
),或者传递给它的可导入路径 - 就像在{{1}中输入它一样声明。
如果您的设置位于.py
,则可以将变量设置为import
。
这是一个简单的单页django应用程序示例,取自优秀的 Lightweight Django 书籍excerpt:
my_settings.py
答案 3 :(得分:0)
错误在
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.settings" % prj_dir.split("/")[-1])
如果从manage.py所在的文件夹运行此脚本,它将返回manage.py文件夹的名称,而不是settings.py文件夹,从而生成managepy_folder.settings
何时应输出settingspy_folder.settings以访问该应用
测试:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settingspy_folder.settings")
如果这是问题,如果你想在多个项目中使用相同的算法或类似的东西,你需要一个模式来修改当前文件夹名称以指示settings.py文件夹名称,在两者中使用相同的文件夹名称不需要修改。
如果没有解决,请发布您的settings.py文件
答案 4 :(得分:0)
如果您的脚本与settings.py位于同一文件夹中,则代码应如下所示:
import os, sys, logging, django
prj_dir = os.path.dirname(os.path.abspath(__file__))
logging.basicConfig(level=logging.INFO)
logging.info("PRJ_DIR: %s" % prj_dir)
sys.path.append(prj_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(os.path.basename(prj_dir)))
django.setup()
否则,如果您的脚本位于settings.py:
的父文件夹中emitEvent
答案 5 :(得分:0)
在行中: os.environ.setdefault( &#34; DJANGO_SETTINGS_MODULE&#34 ;, &#34; myproject.settings&#34;)#应该像在import命令中一样 )
只需使用python模块路径:喜欢&#34; myproject.settings&#34;而不是像/ opt / myproject / settings&#34;或&#34; c:\ myproject \ settings.py&#34;