2014-10-01 1 views
0

나는 다음과 같은 내용으로 'json.py'라는 이름의 모듈을 만들 경우 : '_json로 수입 JSON'..shouldn't왜이 Python3 모듈은 자신의 상대 임포트를 수행하는 것처럼 보입니까?

#! python 
import json as _json 
JSONDecoder = _json.JSONDecoder 

를 문은 절대 가져 오기를 수행, 따라서 파이썬 표준 -을 제공 lib JSON 모듈? 내가 실행하거나이 모듈을 가져 오는 경우

..instead는, 내가 얻을 :

'JSON'이 자체 (상대 가져 오기를) 가져 오는 것을 알 수 요식
 
$ python --version 
Python 3.4.0 
$ python relative_import/json.py 
Traceback (most recent call last): 
    File "relative_import/json.py", line 3, in 
    import json as _json 
    File "/home/silver/Projects/relative_import/json.py", line 6, in 
    JSONDecoder = _json.JSONDecoder 
AttributeError: 'module' object has no attribute 'JSONDecoder' 
$ 

. .. 내가 뭔가를 놓치고 있다고 상상해 봅니다. 파이썬의 임포트 시스템은 항상 자연스럽고 직관적이었습니다 만,이 경우에는 길을 잃어 버렸습니다.

편집 : 내가 사용 파이썬 3.4

편집 : 관심있는 사람들을위한,이 발생한 것입니다 : I 시스템을 '대체'JSON '라는 모듈을 포함하는 패키지가 json '. 이것은 괜찮습니다 (IMO). 그러나 동일한 패키지 폴더 (일시적)에 있지만 궁극적으로는 동일한 모듈의 일부가 아닌 스크립트를 시작했습니다. 따라서, 다음과 같은 상황이 발생

내 스크립트, 패키지 이름/foo.py 실행
  • 파이썬 패키지 이름의 폴더가
  • foo.py 수입
  • packagename.json 수입을 packagename.json의 sys.path에 추가 json (보통 시스템 json이 될 것입니다)
  • sysagename의 첫 번째 항목이 packagename 폴더이고 'json'이 여기에서 가져옵니다.
  • json.py가 가져 오기 작업을 계속로드하고 오류가 발생합니다 거래하고 있기 때문에 그 자체가 아닌 시스템 JSON 모듈)

솔루션 : 나는 그것이 적절한 패키지의 일부가 될하려는 경우 python -m packagename.foo

감사합니다 사용, 내 패키지의 '빈'폴더에 스크립트를 이동하거나 @Martijn Pieters.

답변

3

은 절대 가져 오기를 수행하는입니다.

디렉토리에 살고주요 스크립트가 sys.path에 추가되고, 그 결과 발견 된 첫 번째 json이 스크립트입니다. python relative_import/json.py을 실행 중이므로 Python은 relative_import/sys.path에 추가합니다.

주 스크립트의 이름은 __main__이므로 import json은 별도의 새 모듈 개체로 스크립트 파일을 가져옵니다. 코드가 실제로 두 번로드됩니다.

Interface options documentation 참조 : 스크립트 이름이 파이썬 파일을 직접 참조하는 경우

을, 해당 파일을 포함하는 디렉토리는 sys.path의 시작에 추가되고 파일은 __main__ 모듈로 실행됩니다.

+0

허. 나는 현재 패키지 내에서 모듈을 얻는 유일한 방법은'from '을 사용하는 것이라고 생각했다. import y' 또는 (패키지가 전역 적으로 사용 가능한 경우)'mymodule import y'에서. 고마워요, 제가 누락 된 세부 사항입니다. –

+1

@BrianVisel : 여기 패키지가 없습니다. 최상위 스크립트는 결코 패키지가 아닙니다. 패키지를 대신 스크립트로 사용하려면'-m' 스위치를 사용하십시오. –

+0

참. 흥미로운 생각이 있습니다. 누군가가'.py '확장자를 스크립트에서 제거하지 않고 어딘가에서 스크립트가'bin /'폴더에 들어가면 다른 스크립트에서 가져올 수 있기 때문에 실행하게됩니다. 그들이 의도하지 않은 코드. 물론 시스템에 설치하도록 허용하는 경우 이미 보안 문제가 있습니다. –