Python / Django独立脚本 - 不支持按文件名导入

时间:2017-09-09 23:01:26

标签: python django

我有以下脚本,它意味着是一个独立的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()

...
...

6 个答案:

答案 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;