2009-12-01 3 views
27

를 포함하고 내가라는 파일 models.admin.py이 내가 models.py에 다음과 같은 생각을 할 때 파이썬 패키지를 참조하는 방법 :파일 이름은 내가 장고를 사용하고 기간

from "models.admin" import * 

을하지만, 이중 따옴표가있는 구문 오류가 발생합니다. 난 그냥 얻을 다음

from models.admin import * 

을 할 수없는 경우 그러나 "ImportError를을 : 없음 모듈 이름이 admin"을

는 파이썬 파일 (즉, 이름에 기간이) 가져올 수있는 방법이 있습니까?

+7

안녕하세요? ** 당신이 models.admin.py와 같은 파일 이름을 갖도록 강요합니다 ** ?? models_admin.py 또는 models/admin이라고 부르지 마십시오.py 또는 다른 무엇이 장고와 맞는가? –

+7

제발 하지마. –

+1

기술적으로 모듈이란 패키지가 아니라 패키지입니다. – Cerin

답변

23

실제로 잘못된 이름의 모듈을 가져올 수 있습니다. 하지만 imp을 사용해야합니다 (예 : 가정 파일은

import imp 
with open('models.admin.py', 'rb') as fp: 
    models_admin = imp.load_module(
     'models_admin', fp, 'models.admin.py', 
     ('.py', 'rb', imp.PY_SOURCE) 
    ) 

을하지만, 당신이 그것을 사용하기 전에 imp.find_moduleimp.load_module의 문서를 읽을 수, models.admin.py 지정됩니다.

+3

나쁜 습관? 'imp'는'import'와'__import__'의 메커니즘입니다. 더 많은 유연성을 필요로하지만 더 많은 코드가 필요합니다. 그래도 마법에 관한 것은 없습니다. –

+5

그리고 기계어는 모든 것의 배후에있는 메커니즘입니다. 더 많은 유연성과 .. 내가 어디로가는 지 보지 않겠습니까? :) – shylent

+1

당신이 정말로 그것을 사용해야 할 필요가 있다면 분명히 두 번 생각할 필요가 있습니다. 그러나 그것을 사용하는 것이 끔찍한 잘못은 아닌 것 같습니다. ;) 그리고 그것은 생산에 사용됩니다. Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py –

4

파일 이름은 models/admin.py입니다. (Source)

즉, 이라는 디렉토리에 models이라고해야합니다.

그러면 파이썬 경로에 있다고 가정하고 from models.admin import *을 사용하여 가져올 수 있습니다.

2

아니요. 이름에 마침표 (또는 물음표 또는 느낌표 등)가 포함되어 있으면 Python 파일을 모듈로 가져올 수 없습니다. 파이썬 모듈의 이름 (.py를 포함하지 않음)은 유효한 파이썬 이름이어야합니다 (즉, 변수 이름으로 사용될 수 있음).

+0

참고 자료가 있으면 편리할까요? – Taras

+2

참조는 Python 문법 사양 (https://docs.python.org/2/reference/grammar.html)입니다. 그러나 실제로는 import 문에 허용되는 내용 만 지정합니다. 위의 내용에서 허용하는 답변에서 지적한 것처럼, 근본적인 가져 오기 메커니즘을 사용하여 기술적으로이 문제를 해결할 수 있습니다. –

0
당신은, 당신이 모듈패키지을 참조하는 파일 가져 오기 문에를 참조하지 않습니다

.

docs을 읽으십시오. 해당 내용은 매우 분명합니다.

어쨌든 django를 사용하고 있기 때문에 일반적인 방법은 작동하지 않습니다. 모델을 models.py가 아닌 별도의 파일에 보관하려면 예를 들어 here과 같은 추가 단계를 수행해야합니다.

편집 :
글쎄, 나는 그가 관리를 언급 할 때 정말 questioneer이 무엇을 의미하는지 모르고 여부가 장고의 관리자 인터페이스 관련이있다. 내 요점은 여전히있다.

+1

모듈이 파일입니다. 당신이 참조한 문서를 인용하기 위해서 :'이것을 지원하기 위해 파이썬은 정의를 파일에 넣고 스크립트 나 인터프리터의 대화 형 인스턴스에서 사용하는 방법을 가지고있다. 이러한 파일을 모듈이라고 부르며, ' –

10

당신은 정말, 당신은 특이한 이름을 가진 모듈을 가져올 수 있습니다하려는 경우 (예를 들어, '평'전에 포함 된 파일 이름 '을.') 꼬마 도깨비 모듈 사용 :

>>> import imp 
>>> a_b = imp.load_source('a.b', 'a.b.py') 
>>> a_b.x 
"I was defined in a.b.py!" 

을 그러나 일반적으로 나쁜 생각입니다. 패키지를 사용하려고 할 가능성이 더 높습니다.이 경우 "b.py"라는 파일이 들어있는 "a"라는 디렉토리를 만들어야합니다. 그런 다음 "import a.b"는/b.py를로드합니다.

+1

'load_source'는 적어도 1.5 이후로 폐기되었습니다. –

+0

사실, 비 구식 방법을 사용하는 것은 꽤 간단한 일이지만, a_b = imp.load_module ('a.b', open ('abpy'), os.path.abspath ('abpy' ('.py', 'r', imp.PY_SOURCE)) –

관련 문제