2017-10-12 3 views
2

나는 파이썬 응용 프로그램 (Django 기반)을 가지고 있으며 응용 프로그램과 함께 사용되는 몇 가지 독립 실행 형 유지 관리 스크립트가 있는데, 나는 지금은 항상 호출해야합니다. 그들은 내 응용 프로그램 (하위 패키지)의 일부를 가져와야합니다.python 응용 프로그램의 스크립트 디렉토리에 대한 관용구?

application/ 
    djangoproject/ 
    djangoapp/ 
    otherpackage/ 
    tool1.py 
    tool2.py 

tool1.py 나는 이러한 도구의 꽤 축적 한

from djangoproject import wsgi 
from djangoapp.models import Poll 

할 것입니다 경우, 그리고 scripts 하위 디렉토리로 이동하고 싶습니다 : 현재, 난 그냥 내 최상위 디렉토리에 넣어. 그런 다음 python scripts/tool1.py 또는 cd scripts; python tool1.py을 통해 전화를 걸고 싶습니다.

나는 파이썬의 임포트가 어떻게 작동하는지 이해하고 있으며, 각 스크립트에 줄을 추가하여 부모 디렉토리를 PYTHONPATH에 추가 할 수 있다는 것을 알고있다. 그런 분류 된 스크립트 모음을 처리 할 수있는 패턴이 있는지 궁금합니다. 어쩌면 경로 조작을 다른 파일에 넣고 모든 스크립트를 import mainproject으로 시작할 수 있습니까?

나는 virtualenv를 사용하고 있으며 pip와 함께 의존 관계를 설치하고 있습니다. 그러나 응용 프로그램 자체는 현재 setup.py을 사용하지 않으며, 개발 과정에서 많이 변경되기 때문에 스크립트를 별도의 패키지로 옮기는 데 도움이되지 않을 것이라고 생각합니다. 많은 일회용이 있습니다.

+2

이 스크립트가 장고 앱을위한 작업을 수행하고 있다면 [custom mangement commands] (https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/)를 쓰는 것을 고려해보십시오. 스크립트를 자신의 package/디렉토리에 넣고 venv의 activate 스크립트에있는 env'PATH' 변수에 그 디렉토리를 추가 할 수도 있습니다. – schwobaseggl

답변

1

소스 코드 구성 방법은 프로젝트마다 다릅니다. 내 경험의 년에서 가장 좋은 가장 pythonic 방법은 항상 setup.py 있습니다.

이 경우 pip install -e .으로 만들 수 있으며 디렉토리의 editable version은 virtualenv에 가상으로 설치됩니다. 실제로 설치되지는 않았지만 "링크 됨": .pth 파일로 소스 코드 디렉토리가 sys.path에 추가되므로 나중에 특별한 복사/설치 단계없이 &을 편집 할 수 있습니다.

자세한 내용은 setup.py을 으로 확장 할 수 있습니다. 개발 목적으로 설치하고 pip install -e .[dev]으로 설치하십시오. 환상적인 결과와 더 비슷합니다.

나머지는 스크립트의 특성에 따라 다릅니다. 스크립트가 응용 프로그램의 일부인 경우


, 그들은 entry-points in setup.py를 통해 설치해야합니다. 이 경우

# setup.py: 
setup(
    entry_points={ 
     'console_scripts': [ 
      'tool1 = mytools.tool1:main', 
      'tool2 = mytools.tool2:main', 
     ], 
    }, 
) 

pip install -e . 후, 그들은 VIRTUALENV의 bin 폴더되거나, /usr/local/bin 또는 모두에서 시스템 파이썬 사용되는 경우. 그들이 설치 한 어떤의 VIRTUALENV을 충분히 인식하고

source .venv/bin/activate 
tool1 ... 

# OR: 

~/path/to/venv/bin/tool2 

스크립트는이 방법으로 설치, 그래서 활성화 및 명시적인 파이썬 바이너리는 필요하지 않습니다 :이처럼 그들을 실행할 수 있습니다.응용 프로그램의


스크립트 코드의 유지 보수를 위해 경우

, 그리고 의미 론적 부분은, 그들은 일반적으로 상단 (#!/usr/bin/env python)에서 오두막으로, ./scripts/ 디렉토리 (또는 다른, 예를 들어, ./ci/)에 투입된다. 예, tool1.py :

#!/usr/bin/env python 
def main(): 
    pass 
if __name__ == '__main__': 
    main() 

다음과 같이 인해 오두막 현재 VIRTUALENV에서 실행 : 진입 점을 통해 설치 스크립트와는 달리

source .venv/bin/activate 
./scripts/tool1.py ... 

# OR: 

~/path/to/venv/bin/python ./scripts/tool1.py 

,이 스크립트에서 자신의 VIRTUALENV 모르는 어떤 방식 으로든, virtualenv는 활성화되거나 적절한 파이썬이 명시 적으로 사용되어야합니다.

이 방법은 스크립트가 비 파이썬이 아닌 경우에도 사용됩니다. bash 스크립트 용. 배포가 예측 & 지속 될 수 있도록 두 경우 모두


requirements.txt 파일 때로는 (pip freeze 포함) 응용 프로그램의 & 의존성 '버전으로 사용된다. 그러나 이것은 또 다른 이야기입니다. 응용 프로그램의 배포에 관한 것이고, 패키징에 대한 내용은 아니며 & 유지 관리입니다.

requirements.txt 파일은 setup.py의 새로운 고정 해제 된 (즉, 유연한) 요구 사항과 새로운 패키지 버전을 충족시키기 위해 수시로 재생성됩니다. 하지만 일반적으로 생성 된 콘텐츠 (repo에서 커밋 되었음에도 불구하고)가 아닌 손으로 유지 관리되는 콘텐츠입니다.


당신은 엄격하게 한 후, 어떤 이유로 setup.py이 중 수정 된 ENV var에와 그 스크립트를 실행하지 않으려면 :

PYTHONPATH=. python scripts/tool1.py 

또는 sys.path 내부에서 해킹 :

# tools1.py 
import sys 
import os 
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) 

정확하게 이것은 pip install -e .이 수행하는 것입니다. 모든 호출에서 수작업으로 이루어지며, .pth 파일은 한 번이 아니라 rtualenv. 그리고 이것은 또한 해커처럼 보입니다.

그러나 우리가 알고 있듯이 해킹 솔루션이나 복제 솔루션, 특히 표준 툴킷을 복제하는 솔루션은 모두 "파이썬 (pythonic)"으로 간주되지 않습니다.