2011-04-10 3 views
7

난 그냥 setuptools에와 포장에 받고 있어요, 하나의 모듈과 함께 파이썬 스크립트를 설치하기 위해 권장되는 방법은 다음과 같이, 함수의 이름을 호출하는 스크립트의 이름을 지정하는 것 같다 :파이썬의 setuptools는`__name__ == "__main __"`스타일의 실행을 지원합니까?

setup(
    # ... 
    entry_points = { 
     "console_scripts": [ 
      "script_name": "project.main:main", 
     ], 
    } 
) 

이것은 파이썬 모듈을 실행 가능하게 만드는 표준 방법을 분명히 배제합니다. (나는 마지막으로 어느 것을 체크했는지) if __name__ == "__main__": do_stuff()을 사용합니다. setuptools는이 스타일을 지원합니까, 아니면 주 기능을 정의하고 entry_points에 지정해야합니까?

답변

9

그것은이다 "script_name = project.main:do_stuff setuptools에

setuptools에와는 script_name 그 수입라는 이름의 스크립트를 생성하고 기능 project.main:do_stuff를 실행, 직접 스크립트를 실행할 수 없습니다. setuptools 문서의 this part (Distribute를 사용하는 경우 alternate link)을 다시 읽어야 이러한 이유를 이해할 수 있습니다. 스크립트는 여전히 if __name__ == "__main__"을 포함합니다. 그렇습니다. 이것은 여전히 ​​실행되도록하는 방법입니다.

는 setuptools에

#!/usr/bin/python 
# EASY-INSTALL-ENTRY-SCRIPT: 'distribute==0.6.14','console_scripts','easy_install' 
__requires__ = 'distribute==0.6.14' 
import sys 
from pkg_resources import load_entry_point 

if __name__ == '__main__': 
    sys.exit(
     load_entry_point('distribute==0.6.14', 'console_scripts', 'easy_install')() 
    ) 

나는 그것이 엔트리 포인트와 easy_install을 유사한 스크립트를 정의하는 것이 가장 좋습니다 생각과 함께 설치 easy_install을의 복사본입니다. 예를 들어 if __name__ == "__main__": do_stuff()에 표시 한 것과 같이 엔트리 포인트를 가져 와서 사용합니다. 디버깅 및 초기 테스트에 유용하며, distutils을 사용하는 경우 아무 것도 추가/변경할 필요가 없습니다. dou_stuff()를 호출하여 쉘에서 실행하는 오버 헤드없이 앱에 액세스 할 수있는 다른 앱을 가질 수도 있습니다. 이는 setuptools가 수행하는 작업이며 distutils copy는 스크립트입니다.

+0

로깅을 사용할 때 pypi의 로컬 배포/개발 대 배포에서 '__name__'의 차이점을 어떻게 처리합니까? 나는 로컬 dev에서 "__main__"을 생성하고 setuptools install을 위해 ". "을 생성하므로 preffered'logging.getLogger (__ name __)'을 사용할 수 없을 것 같습니다. – smido

관련 문제