2009-10-06 4 views
3

dev 환경에서 작업하려고하지만 python이 site-packages 디렉토리의 모듈을 사용하고있는 것으로 보이는 문제를 발견했습니다. 내 dev 디렉토리에서 모듈을 사용하고 싶다.파이썬 모듈 검색 경로 문제

의 sys.path이, 그것은 조회의 첫 번째 장소로 현재 디렉토리를 사용하고 좋은이

['', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages' etc 

처럼, DIRS의 무리를 반환 (적어도 이것은 내가 그것으로 이해하는 방법이다).

이제는 현재 디렉토리에 command.py라는 파일을 작성하면 예상대로 작동합니다.

>>> import commands 
>>> commands.__file__ 
    'commands.pyc' 

그런 다음 파이썬 쉘 밖으로 나와 다른 것을 시작하십시오. 나는 이것을한다.

>>> import foo.bar.commands 

이제 내가 할 것으로 예상하고있어 어떤 것은 ./foo/bar/ 거기에서 나에게 명령 모듈을 얻기 위해 현재 디렉토리에서 아래로 이동합니다. 내가 생각 얻을 것은이 내 현재 디렉토리에서이 비록

>>> foo.bar.commands.__file__ 
    '/usr/lib/python2.6/site-packages/foo/bar/commands.pyc' 

imp.find_module()와 imp.load_module를 사용

./foo/bar/commands.py 것은() 나는로드 할 수있다 로컬 모듈을 올바르게 설치하십시오. 세드릭 (난 정말 무슨 뜻인지 모르겠지만) 실제로 흥미가 로컬 디렉토리에서/초기화 .pyc 파일을 푸를 찾을 수 있다면

>>> import foo.bar.commands 
>>> foo.bar.commands.__file__ 
    '/usr/lib/python2.6/site-packages/foo/bar/commands.pyc' 
>>> foo.bar.__file__ 
    '/usr/lib/python2.6/site-packages/foo/bar/__int__.pyc' 
>>> foo.__file__ 
    './foo/__init__.pyc' 

따라서이 시퀀스에서 인쇄 된 마지막 줄이 로컬 디렉토리에서 다른 파일을 찾을 수없는 이유는 무엇입니까?

건배

+0

하위 디렉토리에 __inits__.py가 있습니까? –

답변

3

당신은 당신의 현재 디렉토리 아래에 foo 디렉토리가 있음을 언급하지만 foo/__init__.py이 (심지어 비어)의 존재 여부를 알려하지 않습니다 그렇지 않은 경우,이 foo것을 파이썬을 알려줍니다 아니 패키지. 마찬가지로 foo/bar/__init__.py 인 경우 - 해당 파일이없는 경우 foo/__init__.py 이어도 foo.bar은 패키지가 아닙니다.

당신은 .pth 파일을 배치 및/또는 패키지에 명시 적으로 __path__를 설정하여 약간의 주위를 재생할 수 있지만, 기본, 간단한 규칙은 당신이 파이썬 패키지로 인식 할 모든 디렉토리에 __init__.py을 배치하는 것입니다. 해당 파일의 내용은 패키지 자체의 "본문"이므로 import foofoofoo/__init__.py 파일이있는 디렉토리 인 경우 가져 오기 대상이됩니다 (어떤 경우에도 패키지 본문은 처음 가져올 때 실행됩니다 패키지 또는 패키지의 하위 패키지에 포함 된 것).

이것이 문제가되지 않는다면, 다른 가져 오기 (또는 명시 적 sys.path 조작)가 당신을 망치고있는 것처럼 보입니다. -v 플래그로 파이썬을 실행하면 가져 오기가 눈에 잘 띄게되어 도움이 될 수 있습니다. 또 다른 좋은 방법은 당신이 오작동 및 sys.path에, sys.modules에 (및 수입 후크 등의 가능성이 다른 고급 구조) 그 시점을 검사하는 생각 가져 오기가

import pdb; pdb.set_trace() 

직전에 배치하는 것입니다 - 거기 시스템.modules [ 'foo']가 이미 정의되어 있습니까? 표준 라이브러리 모듈 imp의 함수를 대화식으로 시도하면 사용자를 대신하여 모듈이 경로를 지정하는 것도 도움이 될 수 있습니다.

+0

그것에 대해 가장 좋은 방법을 통찰 해 주셔서 감사합니다. 나는 아직도 문제가 무엇인지 알지 못하지만, 당신이 설명한 것처럼 조사의 길은 문제를 발견하는 가장 좋은 방법이라고 생각합니다. – kalium

+0

@kalium, ok, tx, 어떻게 진행되는지 알려주세요. 그냥 해결하면됩니다. 그렇지 않다면, 아마도 다른 질문으로 충분할 것입니다.) –

0

foo는 /usr/lib/python2.6/site-packages에서 무엇을하고 있습니까? 로컬 디렉토리에 foo를 만들었지 만 반드시 가져 오는 foo가 아닙니다.

디렉토리 구조는 또한이

/foo/__init__.py 
    /bar/__init__.py 
     /commands.py 

과 같은 확인 사이트 패키지 foo는/바 치우는 시도는 파이썬 표준 라이브러리 이름을 재사용하지 않는 것이 좋습니다 자신의 모듈 - commands.py 다른 것을 부를 수 있습니까?

+0

아니, 그 요점을 참조하십시오. 내 /usr/lib/python2.6/site-packages/에 foo를 가질 수있을뿐만 아니라 내 로컬 디렉토리에 foo를 가지고 거기에서 실행할 수도 있습니다. 표준 파이썬 라이브러리는 아닙니다. – kalium