2010-08-21 5 views
4

수입에 문제가 있습니까?파이썬 가져 오기 오류

app 폴더 구조 :

의 MyApp/

  • 모델/models.py가 SpotModel()
  • 시험이 포함/tests.py는 TestSpotModel (unittest.TestCase)을 포함한다. 매력처럼 작동 tests.py 수입 from myapp.models.models import *
  • 스크립트/import.py이 문제가 from myapp.models.models import *

포함 import.py 그 때 오류가 실행 결과 :

ImportError: No module named myapp.models.models 

하지만 테스트합니다. py 실행됩니다.

내가 의도 한대로 작동 nosetests를 사용하여 단위 테스트를 실행 myapp/__init__.py, myapp/models/__init__.py, myapp/tests/__init__.py과 언급 한 바와 같이 __init__.py 파일이 있습니다.

+0

'from foo import *'는 네임 스페이스 충돌을 야기하므로 대단히 권장하지 않습니다. 그 성명서에 어떤 일이 벌어 질지 말하기는 어렵습니다. – msw

+1

나는'import'와 같은 파이썬 키워드로 모듈을 명명하는 것을 피하려고합니다. 이제 당신은'import myapp.import' 할 수 없습니다! – bobince

+0

필자는 그것을 python myapp/scripts/data.py라고 이름을 바꿨다. 그러나 여전히 같은 문제이다. –

답변

4

__init__.py이 아니라 init.py입니다. 가져올 수 있으려면 계층 구조의 각 디렉토리에 포함되어 있는지 확인하십시오.

편집 : 나는 그것을 재현 할 수있었습니다.

내가 문제를 좁힐 수 data.py의 맨 처음에 다음 코드를 삽입
 
[email protected]:/tmp/asdasd$ tree 
. 
`-- myapp 
    |-- __init__.py 
    |-- models 
    | |-- __init__.py 
    | `-- models.py 
    |-- scripts 
    | |-- data.py 
    | `-- __init__.py 
    `-- tests 
     |-- __init__.py 
     `-- tests.py 

: 다음 data.py 방식의 영업 이익을 실행

import sys 
import pprint 

pprint.pprint(sys.path) 

from myapp.models.models import * 

을 yeilds의 ImportError를을 표시 :

다음은 디렉토리 구조의
 
[email protected]:/tmp/asdasd$ python myapp/scripts/data.py 
['/tmp/asdasd/myapp/scripts', 
'/usr/lib/python2.6', 
'/usr/lib/python2.6/plat-linux2', 
'/usr/lib/python2.6/lib-tk', 
-- Skipped -- 
'/usr/local/lib/python2.6/dist-packages'] 
Traceback (most recent call last): 
    File "myapp/scripts/data.py", line 6, in 
    from myapp.models.models import * 
ImportError: No module named myapp.models.models 

하지만이 방법은 매력처럼 작동합니다.

 
[email protected]:/tmp/asdasd$ python -m myapp.scripts.data 
['', 
'/usr/lib/python2.6', 
'/usr/lib/python2.6/plat-linux2', 
'/usr/lib/python2.6/lib-tk', 
-- Skipped -- 
'/usr/local/lib/python2.6/dist-packages'] 

sys.path의 첫 번째 항목의 차이점에 유의하십시오.

+0

(이것은 형 식 오류입니다.) – bobince

+0

그는 backticks가 없으므로'__init __. py'라고 썼습니다. 그래서 markdown은 그것을 굵게 표시해야한다고 생각했습니다. – delnan

+0

스크립트 폴더 내에 __init__.py도 필요합니까? 나는 그것을 추가하려했지만 여전히 같은 오류가있다. –

1

import.py을 어떻게 실행합니까? 그렇게 할 때 현재 작업 디렉토리는 무엇입니까?

myapp 디렉토리는 파이썬 경로에 있어야합니다 (예. sys.path에 나열된 디렉토리 중 하나가 내부에) 당신이 그것을 import 수 있으려면. 파이썬은 인터프리터가 시작할 때 자동으로 현재 작업 디렉토리를 경로 목록에 추가합니다.

myapp이 들어있는 디렉토리를 수동으로 경로에 추가되지 않도록 경우 (예. PYTHONPATH 환경 변수를 사용하거나 sitecustomize.py에서 sys.path에 추가), 당신은 당신이를 실행할 때 myapp 들어있는 디렉토리에 있어야합니다 스크립트. myapp 디렉토리 안에 있다면 myapp 패키지를 가져올 수 없습니다.

+0

python myapp/scripts/import.py와 같이 실행하고있다. –

1

sys.path은 테스트를 실행할 때와 스크립트를 실행할 때 명확하게 설정되지 않습니다.

import sys 
print(sys.path) 

두 모듈의 상단에 확인하십시오. 그리고, 실종 경우 myapp의 부모 디렉토리를 sys.path에 추가하여 (잘못 하나를 수정.

0

당신이 그것을 언급하는 것을 잊었다하지 않는 한, 당신은 myapp/scripts__init__.py이없는, 그래서 myapp/scripts/import.py는 아니다 myapp의 모듈. myapp 않는 한

은 바로 이곳에서 찾고되지 않기 때문에 스크립트를 찾을 수없는, 어떻게 든 글로벌 경로에 있습니다.

스크립트에 의해 모듈을 폴더를 만들어 하나 __init__.py을 추가하고 scr을 파일 시스템 계층 구조를 ipts (myapp 또는 상위 폴더로) 또는 경로에 myapp을 설치합니다 (예 : 그것을 packages 폴더로 이동하십시오. /usr/lib/python2.6/dist-packages/).