[python] PYTHONPATH 대 sys.path

다른 개발자와 저는 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를 사용해야합니까, 아니면 괜찮습니까?



답변

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


답변

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

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

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


답변

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

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


답변

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

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

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


답변

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

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

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


답변

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

pip install --editable path/to/project

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

from setuptools import setup
setup('project')


답변