PYTHONPATH 대 sys.path


92

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

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

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

script.py에서 import package.lib. 패키지가 사이트 패키지에 설치되면 script.py는 package.lib.

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

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

파이썬이 package.lib.

이 줄은 개발자 나 로컬 복사본에서 실행하는 사람들에게만 유용하기 때문에 이것이 나쁜 생각이라고 생각합니다. 그러나 이것이 나쁜 생각 인 이유를 설명 할 수 없습니다.

PYTOHNPATH, sys.path를 사용해야합니까, 아니면 괜찮습니까?


4
투표와 답변은 PYTHON_PATH를 사용하는 데 약간의 기울임으로 상당히 균등하게 나뉘어져 있지만 샘플링 잡음이나 질문에서 의도하지 않은 편향이 될 수 있습니다.
AJP

답변:


42

경로를 수정하는 유일한 이유가 작업 트리에서 작업하는 개발자를위한 것이라면 설치 도구를 사용하여 환경을 설정해야합니다. virtualenv는 매우 널리 사용되며 setuptools를 사용하는 경우 setup.py develop현재 Python 설치에서 작업 트리를 반 설치하기 위해 실행 하면됩니다.


10
이에 대해 좀 더 설명해 주시겠습니까? conda / virtualenv 환경을 사용하더라도 어떻게 파이썬 경로에 최상위 디렉토리를 배치할까요?
compguy24

38

나는 PYTHONPATH가 싫어. 사용자 단위 (특히 데몬 사용자의 경우)로 설정하고 프로젝트 폴더가 이동하는 동안 추적하는 것이 부서지기 쉽고 성가신 일입니다. 나는 sys.path독립형 프로젝트를 위해 호출 스크립트를 설정 하는 편이 낫습니다.

그러나 sys.path.append그렇게하는 방법은 아닙니다. 쉽게 중복을 얻을 수 있으며 .pth파일을 정렬하지 않습니다 . 더 나은 (더 읽기 쉬운) : site.addsitedir.

그리고 script.py일반적으로 경로에서 사용할 수 있도록하려는 패키지 내부에 있기 때문에 더 적절한 장소가 아닙니다 . 라이브러리 모듈은 확실히 sys.path스스로를 건드리지 않아야 합니다. 대신, 일반적으로 앱을 인스턴스화하고 실행하는 데 사용하는 패키지 외부에 hashbanged-script가 있으며이 간단한 래퍼 스크립트에 sys.path-frobbing 과 같은 배포 세부 정보를 넣습니다.


16
의 문제 site.addsitedirappendon sys.path을 수행한다는 것입니다. 즉, 설치된 패키지가 개발중인 로컬 패키지보다 우선합니다 (머리를 잡아 당길 수 있음). sys.path.insert(0...그것을 극복하기 위해 필요합니다.
Eli Bendersky 2013

5
@EliBendersky :이어야합니다 sys.path.insert(1. stackoverflow.com/q/10095037/125507
endolith 2014-06-14

12

일반적으로 환경 변수 (예 : PYTHONPATH)를 설정하는 것이 좋지 않은 방법이라고 생각합니다. 일회성 디버깅에는 괜찮을 수 있지만
정기적 으로 사용 하는 것은 좋은 생각이 아닐 수 있습니다.

환경 변수를 사용하면
다른 사람이 코드 기반에서 문제를보고 할 때 "나에게 적합합니다"와 같은 상황이 발생합니다. 또한 테스트 환경에서도 동일한 관행을 수행하여 특정 개발자에게는 테스트가 정상적으로 실행되지만 일부 테스트를 시작하면 실패 할 수 있습니다.


6

이미 언급 한 다른 많은 이유와 함께 하드 코딩

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

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


5

이 경우 PYTHONPATH를 사용하는 것이 더 나은 것이라고 생각합니다. 대부분 (의심스러운) 불필요한 코드를 도입하지 않기 때문입니다.

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

사용자가 "로컬 복사본"에서 실행하기로 선택한 경우 호출 한대로 일반적인 관행은 사이트 패키지 외부에서 사용되는 경우 패키지를 PYTHONPATH에 수동으로 추가해야한다고 명시하는 것입니다. .


3

앞서 언급 한 이유 때문에 해킹 PYTHONPATHsys.path좋은 생각 도 아닙니다 . 그리고 현재 프로젝트를 site-packages 폴더에 연결하는 python setup.py develop데는 여기에 설명 된 것처럼 실제로보다 나은 방법이 있습니다 .

pip install --editable path/to/project

프로젝트의 루트 폴더에 setup.py가없는 경우 다음으로 시작하기에 충분합니다.

from setuptools import setup
setup('project')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.