2013-06-30 1 views
0

Mac에서 Flask 서버를 로컬로 실행하고 있습니다.상대 가져 오기를 사용하려고 시도했는데 가져 오기 경로가 손상 되었습니까?

내 프로젝트 :

project/my_lib/my_class.py 
project/testing/flask_server.py 
project/testing/something/test_class.py 

한 시점에서, 나는 어떤 상대 수입은 다른 디렉토리에 클래스를 테스트하기 위해 함께 멋진 가려고 :

프로젝트 에서/테스트/일/test_class.py :

from ..my_lib.my_class import MyClass 

나에게 오류를 준 :

나는 새로운 수입 코드를 제거하더라도,
ValueError: Attempted relative import beyond toplevel package 

그래서 나는 그 외에서는 지원하지만, 지금은 를 실행하는 내 플라스크 서버를 얻을 수 없습니다.

Traceback (most recent call last): 
    File "testing/flask_server.py", line 2, in <module> 
    from flask import Flask 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/__init__.py", line 17, in <module> 
    from werkzeug.exceptions import abort 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/__init__.py", line 154, in <module> 
    __import__('werkzeug.exceptions') 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/exceptions.py", line 71, in <module> 
    from werkzeug.wrappers import Response 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/wrappers.py", line 26, in <module> 
    from werkzeug.http import HTTP_STATUS_CODES, \ 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/http.py", line 28, in <module> 
    from urllib.request import parse_http_list as _parse_list_header 
ImportError: No module named request 

허 :

$ python testing/flask_server.py 

이 밖으로 뱉어?


UPDATE :

플라스크를 가져 오기 오류는 잘못된 코드가 처음 호출 된 디렉토리에 발생합니다. 나는 어디서나 프로젝트/테스트 디렉토리에에서

from flask import Flask 

을 할 경우 즉, 내가 가져 오기 오류가,하지만 난 내 시스템에 다른 곳 프로젝트/에서 할 경우 나, 괜찮아. .?


솔루션 (PARTLY) :

내가 이런 일이 이유에 대한 설명이없는,하지만 난 그것을 해결하기 위해 다음과 같은 않았다

  1. 을 새로운 을 만든 testing/ 디렉토리에 복사하고 이전 파일을 파일에 복사합니다. 이전 테스트/ 디렉토리를 삭제해야했습니다. 기본적으로 손상되었습니다.
  2. 상대 경로 대신 절대 경로를 사용하여 내 교차 디렉터리를 가져 왔습니까?

은 (그건 그렇고, 내가 상대 가져 오기 오류를 재현하는 나의 단계를 되돌아 시도했지만 할 수 없습니다, 그래서 나는이 모든 일의 원인이나 해결책 중 하나의 확실하지 않다.)

답변

2

시스템 경로에 아마도 로컬 디렉토리에 자신의 urllib2 파이썬 파일이있을 것입니다. werkzeug (및 다른 파이썬 코드)이 깨져서 그렇게하지 마십시오.로컬 urllib2.py 모듈 또는 urllib2/__init__.py 패키지 그 마스크 표준 라이브러리 파일이있는 경우

try: 
    from urllib2 import parse_http_list as _parse_list_header 
except ImportError: # pragma: no cover 
    from urllib.request import parse_http_list as _parse_list_header 

from urllib2 import parse_http_list as _parse_list_header 라인이 ImportError 예외를 던질 수 :

werkzeug는 같은 구조를 사용하여, 파이썬 2와 3 모두와 호환되도록하려면 . 최초의 수입이 ImportError을 발생하기 때문에 urllib.request 패키지 프로젝트에서 파이썬 3

에서만 사용할 수 있기 때문에

, 두 번째 줄은 이 실패하는, 실행, 곳을 진단하기 위해 다음 코드를 실행 해당 모듈이 : 그것은 여전히 ​​작동하는 경우

import urllib2 
print urllib2.__file__ 

을, 다음 실행

from urllib2 import parse_http_list as _parse_list_header 

urllib2은 간접적으로 마스크 한 것을 가져올 수 있습니다. urllib2은 예를 들어 from urlib import ... 문을 사용하므로 로컬 urllib 모듈도 가져 오기를 중단합니다.

플라스크 프로젝트에서 from flask import Flask 줄 바로 앞에 을 입력하는 것이 중요합니다.

+0

감사합니다.이게'print urllib2 .__ file__' yeilds :'/ Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.pyc'입니다. 로컬이 아니며 가져 오기 오류가 발생하기 전에 작동했던 것과 동일한 코드를 실행하고 있습니다. 그래서 이전에 작동중인 코드가 지금 왜 고장 났는지, 그리고 어떻게 해결해야하는지에 대해서는 여전히 불분명합니다. – Yarin

+0

'from urllib2 import ...'라인을 시도해 본다. –

+0

'from urllib2 import ...'라인은 에러가 아니다. (왜'from urllib.request import ...'라인이 호출 되더라도 ?!) – Yarin