2017-11-30 8 views
5

그래서 필자가 작성한 파이썬 스크립트를 패키징하고 서브 모듈을 가지고 있습니다. submodule이라고 부르 자. 폴더 구조는 다음과 같습니다 Python은 설치되지 않은 모듈을 가져올 수 있습니다.

cool_script/ 
    setup.py 
    cool_script.py 
    submodule/ 
    __init__.py 
    implementation.py 

지금, 많은 pip install .pip install -e . 통화 후, 나는 submodule가 전 세계적으로 가져올 수있는 상황이있다. 내 시스템이 항상 작동 상관없이 :

$ python3 
[...] 
>>> import submodule 
>>> submodule.__file__ 
'/home/me/fake/path/cool_script/submodule/__init__.py' 

하지만 난 이유를 모르겠어.

내가 만든 패키지가 다시 제거되었고 pip는 해당 색인에서 하위 모듈을 찾을 수 없습니다.

$ ls /usr/local/lib/python3.4/dist-packages | ack cool 
$ ls /usr/local/lib/python3.4/dist-packages | ack submodule 
$ 

PYTHONPATH뿐만 아니라 비어 :

$ echo $PYTHONPATH 

$ 

왜 파이썬은 submodule의 위치를 ​​알고 않습니다 DIST-패키지 것도 하나 없다, 나는 수동으로 여전히 주위에 거기에 앉아 있던 cool_script.egg-link 삭제 ? 어떻게 알 수 있습니까?

+0

virtualenv에 설치 되었습니까? 리눅스 시스템인가? –

+0

이것은 실제로 리눅스 시스템이며, 아니요, 저는 지구 환경에서 이러한 실험을했습니다. 나는 그것이 매우 바보 같았다. 수업은 배웠습니다. – iFreilicht

+0

이것은 바보 같지만 재부팅을 시도 했습니까? 어딘가에 그냥 캐쉬되었을 수도 있습니다 – RunOrVeith

답변

3

처음 실행 python -c "import site; print(site.getsitepackages())".

['/XXX/something/site-packages'] 

는 일반적으로이 목록에 하나의 경로가, 그리고 pip이 스크립트를 설치하는 디렉토리를 가리키는 : 그것은 다음과 같은 목록을 인쇄합니다. 호기심이 생기면 ls을 넣을 수 있습니다 : ls /XXX/something/site-packages/.

더 흥미롭게도 pip은 개발자 설치 (a.k.a. 012.)를 사용할 때 해당 디렉토리에 "링크"파일을 넣습니다. "링크"파일의 이름은 원래 프로젝트의 이름 끝에 .egg-link입니다.

따라서 해당 디렉토리에는 cool_script.egg-link 파일이있을 것입니다. 그리고 그것을 출력하려고하면 모듈의 원래 파일 시스템 위치가 그 내용에 포함되어 있음을 발견하게 될 것입니다. 뭔가 같이 :

$ cat /XXX/something/site-packages/cool_script.egg-link 
/home/me/fake/path/cool_script/ 
. 

이것은 개발자 모드에 뭔가를 설치 한 방법 pip 기록이지만, 파이썬은 실제로 오른쪽 모듈 (즉, 너무 쉽게했을 찾는 방법을 알고 어떻게하지? -)).

파이썬에 대한 .egg-link 파일을 알 수는 없지만 sys.path (*)에 대한 추가 경로를 얻을 수있는 site-packages 디렉토리에있는 모든 .pth 파일을 읽습니다. 따라서 Python이 개발자 모드 설치를 가져올 수 있으려면 pip은 이라는 파일에 모두 easy-install.pth이라는 파일을 작성합니다 (이전 easy-install 도구가 실제로이 기술을 개척했기 때문에). 해당 파일을 인쇄하는 경우, 당신은 개발자 모드로 설치 모든 프로젝트 경로의 목록을 얻을 것이다 :

$ cat /XXX/something/site-packages/easy-install.pth 
/home/me/fake/path/cool_script/ 
/home/me/another/project/ 

을 그리고 당신은 참으로 모든 경로가 당신의 sys.path에 추가됩니다 실제로 easy-install.pth에 나와있는 것을 확인할 수 있습니다 .

(*) 기술적으로, .pth 파일을 읽는 Python 부분은 일반적으로 시작시 자동으로 가져 오는 site 모듈입니다. 예를 들어 python -S을 사용하여 site 모듈을 사용하지 않도록 설정하는 옵션이 있습니다. 이 경우 sys.pathsite-packages 디렉토리 나 개발자 설치 경로가 포함되어 있지 않음을 알 수 있습니다.

+0

그게이 폴더는'easy-install.pth'에 나열되어 있습니다. 그것을 제거하면 문제가 해결되었습니다! 철저한 설명에 감사드립니다. – iFreilicht