2009-02-02 2 views
5

공통 정의를 사용하는 여러 스크립트가 있습니다. 여러 파일로 분할하는 방법은 무엇입니까? 또한 응용 프로그램을 내 시나리오에 어떤 식 으로든 설치할 수 없습니다. 동시에 실행되는 임의의 수의 버전을 가질 수 있어야하며 수퍼 유저 권한없이 작동해야합니다. 내가 함께 왔어요 솔루션은 다음과 같습니다 : 모든 스크립트파이썬 응용 프로그램을 모듈화하는 방법

  • 중복 코드. 지저분 해, 아마도 최악의 구성표.
  • 모든 스크립트와 공통 코드를과 을 사용하여로드하는 단일 디렉토리에 넣으십시오. 이 접근 방식의 단점은 입니다. 응용 프로그램보다 다른 디렉토리에 내 라이브러리를 추가하고 싶습니다.
  • 공통 코드를 자체 디렉토리에 넣고 모든 하위 모듈을 가져 오는 __init__.py을 작성하고 마지막으로 from . import을 사용하여로드합니다. 코드를 체계적으로 유지하지만, __init__.py을 유지 관리하고 이름을 한정하려면 약간의 오버 헤드가 있습니다.
  • sys.pathimport에 라이브러리 디렉토리를 추가합니다. 나는이 경향이 있지만, sys.path 로 치장하고 있는지 여부는 잘 모르겠습니다.
  • 로드하여 (파이썬 3 exec) execfile . 이전의 두 가지 접근 방법의 장점을 결합했습니다. 모듈당 줄 하나만 필요하며 전용을 사용할 수 있습니다. 반면에,이 은 파이썬 모듈 개념을 피하고 은 전역 이름 공간을 공격합니다.
  • distutils을 사용하여 모듈을 작성하고 설치하십시오.이 은 모든 파이썬 스크립트에 대한 라이브러리를 설치하고 수퍼 유저 권한 이 필요하며 다른 응용 프로그램에 영향을 미치므로 내 경우에는 적용 할 수 없습니다.

가장 좋은 방법은 무엇입니까?

답변

8

(일반적으로 site.addsitedir을 사용하여) sys.path에 추가하는 것은 매우 일반적이며 특히 싫은 일이 아닙니다. 물론 일반적인 작업 공유 자료가 모듈 어딘가에 있으면 편리 할 것입니다.

파이썬 2.6 이상을 사용하는 경우 sys.path 또는 PYTHONPATH에 추가하지 않고도 사용할 수있는 사용자 수준 모듈 폴더가 이미 있습니다. Unix 계열의 ~/.local/lib/python2.6/site-packages입니다. 자세한 내용은 PEP 370을 참조하십시오.

+0

+1 : PYTHONPATH 환경 변수 만 설정하면됩니다. 간단하고 깔끔하고 휴대 가능하며 깨끗합니다. 어디에서나 작동합니다. –

+0

@ S.Lott : 쉘 환경이있는 모든 곳에서 작동합니다. 게다가 이것에 대한 시작 스크립트가 필요합니다. 이것은 – phihag

+0

@phihag를 복잡하게 만듭니다. 실제로 시작 스크립트가 필요하지 않습니다. PYTHONPATH는 .bashrc 또는 Windows 설정에서 설정할 수 있습니다. –

4

PYTHONPATH 환경 변수를 라이브러리 파일이있는 디렉토리로 설정할 수 있습니다. 이렇게하면 해당 경로가 라이브러리 검색 경로에 추가되고 일반 import을 사용하여 경로를 가져올 수 있습니다.

1

sys.path에 수동으로 경로를 추가하는 또 다른 방법은 환경 변수 PYTHONPATH을 사용하는 것입니다.

또한, distutils 당신이 같은 모듈 이름으로 동시에 실행하는 여러 버전이해야하는 경우

python setup.py install --home=/my/dir 

그러나, 이들 중 어느 것도 현실적 사용하여 사용자 정의 설치 디렉토리를 지정할 수 있습니다. 이 경우 아마도 sys.path을 수정하는 것이 가장 좋습니다.

1

두 개 이상의 프로젝트에 대해 세 번째 접근법을 사용했습니다 (sys.path에 디렉토리 추가). 올바른 접근 방식이라고 생각합니다.

3

다양한 조합의 종속성이있는 환경이있는 경우 좋은 솔루션은 virtualenv을 사용하여 각자 설치된 패키지 세트가있는 샌드 박스 파이썬 환경을 만드는 것입니다. 각 환경은 시스템 차원의 Python 사이트 패키지 설정과 동일한 방식으로 작동하지만 로컬 환경을 만들려면 수퍼 유저 권한이 필요하지 않습니다.

Google은 plenty of info이지만, this은 꽤 좋은 출발점처럼 보입니다.

관련 문제