본문 바로가기

프로그래밍/Python

[Django] Django import LOCAL settings 문제.

반응형

Django import LOCAL settings 문제.


원문링크 : https://stackoverflow.com/questions/22904209/django-cannot-import-local-settings



질문 by Brownbay


Django 1.7을 Python 3 에서 구동해 보았다.


그런데, manage.py 를 사용할 때, settings.py 의 import local_settings.py 부분이 문제가 생긴다.


settings.py 를 직접 실행할 때에는 local_settings.py 는 문제없이 임포트된다.


하지만, manage.py 를 실행하면, 아래와 같이 local_settings.py 모듈을 찾을 수 없다고 나온다.

local_settings.py 파일은 settings.py 와 같은 위치에 있다.


무엇이 문제일까?


EDIT: Playing around with Django 1.7... and Python 3


I can't seem to import local_settings.py into my settings.py file when using manage.py.


If I execute the settings.py file directly, my local_settings.py file is imported fine, without any errors.


However, when I run manage.py, it complains that it could not find the local_settings.py module. settings.py and local_settings.py are in the same folder...


Any ideas?


Traceback (most recent call last):

  File "/home/cg/webdev/riv_com/lib/python3.4/site-packages/django/conf/__init__.py", line 94, in __init__

    mod = importlib.import_module(self.SETTINGS_MODULE)

  File "/usr/lib/python3.4/importlib/__init__.py", line 104, in import_module

    return _bootstrap._gcd_import(name[level:], package, level)

  File "<frozen importlib._bootstrap>", line 2231, in _gcd_import

  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load

  File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked

  File "<frozen importlib._bootstrap>", line 1129, in _exec

  File "<frozen importlib._bootstrap>", line 1448, in exec_module

  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed

  File "/home/cg/webdev/riv_com/riv_com/riv_com/settings.py", line 79, in <module>

    from local_settings import *

ImportError: No module named 'local_settings'


During handling of the above exception, another exception occurred:


Traceback (most recent call last):

  File "./manage.py", line 10, in <module>

    execute_from_command_line(sys.argv)

  File "/home/cg/webdev/riv_com/lib/python3.4/site-packages/django/core/management/__init__.py", line 427, in execute_from_command_line

    utility.execute()

  File "/home/cg/webdev/riv_com/lib/python3.4/site-packages/django/core/management/__init__.py", line 386, in execute

    settings.INSTALLED_APPS

  File "/home/cg/webdev/riv_com/lib/python3.4/site-packages/django/conf/__init__.py", line 46, in __getattr__

    self._setup(name)

  File "/home/cg/webdev/riv_com/lib/python3.4/site-packages/django/conf/__init__.py", line 42, in _setup

    self._wrapped = Settings(settings_module)

  File "/home/cg/webdev/riv_com/lib/python3.4/site-packages/django/conf/__init__.py", line 98, in __init__

    % (self.SETTINGS_MODULE, e)

ImportError: Could not import settings 'riv_com.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named 'local_settings'





답변 by lanzz



Python 3.4는 implicit relative import (암묵적 상대경로 임포트)를 지원하지 않는다. 즉, Python3 에서 from local_settings import * 는 absolute import 절대경로 임포트이기 때문에, sys.path 에서만 local_settings 를 탐색하고, setttings.py 가 있는 디렉토리에서는 탐색경로에 포함되지 않는다. 이를 해결하기 위해선 명시적으로 relative import  (상대경로 임포트)임을 알려주면 된다. 즉, from .local_settings import * 와 같이 하면 된다. 이 문법은 Python 2.7 에서도 동작한다.


Python 3.4 does not support implicit relative imports: from local_settings import * in Python 3 is an absolute import and would only search for a local_settings module in your sys.path, but NOT in the same directory where your settings.py module is. You need to use explicit relative import: from .local_settings import *; this would also work in Python 2.7.


Reference: PEP 328




728x90