문제

다른 개발자와 저는 Python이 사용자(예: 개발) 디렉터리에서 Python 패키지를 찾을 수 있도록 PYTHONPATH 또는 sys.path를 사용해야 하는지에 대해 동의하지 않습니다.

일반적인 디렉터리 구조를 가진 Python 프로젝트가 있습니다.

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

script.py에서 다음을 수행해야 합니다. import package.lib.패키지가 site-packages에 설치되면 script.py는 다음을 찾을 수 있습니다. package.lib.

그러나 사용자 디렉터리에서 작업할 때는 다른 작업을 수행해야 합니다.내 해결책은 "~/Project"를 포함하도록 PYTHONPATH를 설정하는 것입니다.또 다른 개발자는 script.py의 시작 부분에 다음 코드 줄을 추가하려고 합니다.

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

Python이 로컬 복사본을 찾을 수 있도록 package.lib.

나는 이것이 나쁜 생각이라고 생각합니다. 이 줄은 개발자나 로컬 복사본에서 실행하는 사람들에게만 유용하기 때문입니다. 그러나 이것이 왜 나쁜 생각인지에 대한 타당한 이유는 제시할 수 없습니다.

PYTOHNPATH, sys.path를 사용해야 할까요, 아니면 둘 중 하나가 좋을까요?

도움이 되었습니까?

해결책

경로를 수정하는 유일한 이유는 작업 트리에서 작업하는 개발자가 설치 도구를 사용하여 환경을 설정해야합니다. VirtualEnV는 매우 인기가 있으며 SetUptools를 사용하는 경우 간단히 실행할 수 있습니다. setup.py develop 현재 파이썬 설치에서 작업 트리를 반 설치합니다.

다른 팁

나는 Pythonpath가 싫어. 사용자 당 (특히 데몬 사용자의 경우)을 기준으로 설정하고 프로젝트 폴더가 움직일 때 추적하는 것이 부서지기 쉬우 며 성가신 것을 알았습니다. 나는 오히려 훨씬 더 설정할 것입니다 sys.path 독립형 프로젝트를위한 Invoke 스크립트에서.

하지만 sys.path.append 그것을하는 방법이 아닙니다. 쉽게 복제를받을 수 있으며 정리하지 않습니다. .pth 파일. 더 나은 (그리고 더 읽기 쉬운) : site.addsitedir.

그리고 script.py 일반적으로 더 적절한 장소가 아닐 것입니다. 내부에 경로에서 사용할 수있는 패키지. 라이브러리 모듈은 확실히 만지지 않아야합니다 sys.path 그들 자신. 대신, 일반적으로 앱을 인스턴스화하고 실행하는 데 사용하는 패키지 외부에는 해시 스크립트가 있으며이 사소한 래퍼 스크립트에 배치 세부 정보를 넣을 수 있습니다. sys.path-브로빙.

일반적으로 나는 환경 변수 (PythonPath와 같은)를 설정하는 것이 나쁜 관행이라고 생각합니다. 이것은 디버깅을 벗어나지 만 이것을 사용하는 데는 괜찮을 수 있습니다.
정기적 인 연습은 좋은 생각이 아닐 수도 있습니다.

환경 변수의 사용량은 "나를 위해 작동한다"와 같은 상황으로 이어집니다.
그렇지 않으면 코드 기반의 문제를보고합니다. 또한 테스트 환경에서도 동일한 연습을 할 수있어 특정 개발자에게는 잘 실행되는 테스트와 같은 상황이 발생하지만 일부는 테스트를 시작할 때 실패 할 수 있습니다.

이미 언급한 다른 많은 이유와 함께 하드 코딩을 지적할 수도 있습니다.

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

script.py의 위치를 ​​가정하기 때문에 취약합니다. script.py가 프로젝트/패키지에 있는 경우에만 작동합니다.사용자가 script.py를 (거의) 다른 곳으로 이동/복사/symlink하기로 결정하면 중단됩니다.

이 경우 PythonPath를 사용하는 것이 더 나은 일이라고 생각합니다. 대부분은 (의심스러운) 비정상 코드를 소개하지 않기 때문입니다.

결국, 당신이 그것을 생각한다면, 당신의 사용자 필요하지 않습니다 sys.path 패키지가 포장 시스템을 사용하기 때문에 패키지가 사이트 패키지에 설치되기 때문에 물건.

사용자가 "로컬 사본"에서 실행하기로 선택한 경우, 전화대로, 일반적인 관행은 상태를 유지하는 것이며, 패키지가 PythonPath에 수동으로 추가되어야한다는 것을 관찰했습니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top