나는 다음과 같은 내용으로 '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.
허. 나는 현재 패키지 내에서 모듈을 얻는 유일한 방법은'from '을 사용하는 것이라고 생각했다. import y' 또는 (패키지가 전역 적으로 사용 가능한 경우)'mymodule import y'에서. 고마워요, 제가 누락 된 세부 사항입니다. –
@BrianVisel : 여기 패키지가 없습니다. 최상위 스크립트는 결코 패키지가 아닙니다. 패키지를 대신 스크립트로 사용하려면'-m' 스위치를 사용하십시오. –
참. 흥미로운 생각이 있습니다. 누군가가'.py '확장자를 스크립트에서 제거하지 않고 어딘가에서 스크립트가'bin /'폴더에 들어가면 다른 스크립트에서 가져올 수 있기 때문에 실행하게됩니다. 그들이 의도하지 않은 코드. 물론 시스템에 설치하도록 허용하는 경우 이미 보안 문제가 있습니다. –