Python / Django Standalone Script - Import by file name is not supported

I have the following script and it must be a standalone Django script, so I can run it python my_script.pyfrom the command line. It worked with Django 1.8, after I upgraded to Django 1.11, I get the following error:

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.

This is my python script

# 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()

...
...
+4
source share
6 answers

It seems you are trying to split the file path with a slash /when you run the script on Windows, where the path separator is the backslash \. Use os.path.basenameinstead of manual handling of bites ( .split("/")[-1]):

>>> import os
>>> os.path.basename(r'/home/user/project')
'project'
>>> os.path.basename(r'c:\users\user\project')
'project'

Compared:

>>> r'/home/user/project'.split("/")[-1]
'project'  # works
>>> r'c:\users\user\project'.split("/")[-1]
'c:\\users\\user\\project'  # error
+8
source

, , DJANGO_SETTINGS_MODULE .

Python. , .py, ( .py) - , import.

my_settings.py, my_settings.

django, :

import sys


from django.conf import settings


settings.configure(
    DEBUG=True,
    SECRET_KEY='thisisthesecretkey',
    ROOT_URLCONF=__name__,
    MIDDLEWARE_CLASSES=(
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ),
)


from django.conf.urls import url
from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello World')


urlpatterns = (
    url(r'^$', index),
)


if __name__ == "__main__":
    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)
+1

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.settings" % prj_dir.split("/")[-1])

script , 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

0

If your script is in the same folder as settings.py, the code should look something like this:

import os, sys, logging, django
prj_dir = os.path.dirname(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()

else if your script is in the settings.py parent folder:

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()
0
source

in line: os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "myproject.settings") # should be like in the import command)

Just use the python module path: for example, "myproject.settings" instead of the path, for example / opt / myproject / settings "or" c: \ myproject \ settings.py "

0
source

Source: https://habr.com/ru/post/1685376/


All Articles