[PYTHON] 파이썬 setuptools로 설치 후 스크립트
PYTHON파이썬 setuptools로 설치 후 스크립트
사용자가 다음 명령을 실행할 수 있도록 설치 후 Python 스크립트 파일을 setuptools setup.py 파일의 일부로 지정할 수 있습니까?
python setup.py install
로컬 프로젝트 파일 아카이브 또는
pip install <name>
PyPI 프로젝트에서 스크립트는 표준 setuptools 설치 완료시 실행됩니까? 단일 Python 스크립트 파일 (예 : 사용자에게 사용자 정의 설치 후 메시지 전달, 다른 원격 소스 저장소에서 추가 데이터 파일 가져 오기)로 코딩 할 수있는 설치 후 작업을 수행하려고합니다.
나는 몇 년 전에이 주제를 다룬이 SO 답을 찾았고 그 당시의 합의가 install 부속 명령을 작성해야한다고 생각하는 것처럼 들린다. 그렇다면 스크립트를 실행하기 위해 두 번째 명령을 입력 할 필요가 없도록 누군가가이 작업을 수행하는 방법에 대한 예제를 제공 할 수 있습니까?
해결법
-
==============================
1.이 솔루션은보다 투명합니다.
이 솔루션은보다 투명합니다.
setup.py에 몇 가지 추가 사항을 추가 파일을 만들 필요가 없습니다.
또한 두 가지의 다른 사후 설치를 고려해야합니다. 하나는 개발 / 편집 모드 용이고 다른 하나는 설치 모드 용입니다.
설치 후 스크립트가 포함 된이 두 클래스를 setup.py에 추가하십시오.
from setuptools import setup from setuptools.command.develop import develop from setuptools.command.install import install class PostDevelopCommand(develop): """Post-installation for development mode.""" def run(self): # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION develop.run(self) class PostInstallCommand(install): """Post-installation for installation mode.""" def run(self): # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION install.run(self)
setup.py의 setup () 함수에 cmdclass 인수를 삽입하십시오.
setup( ... cmdclass={ 'develop': PostDevelopCommand, 'install': PostInstallCommand, }, ... )
다음과 같이 설치 후 쉘 명령을 호출 할 수도 있습니다.
from setuptools import setup from setuptools.command.develop import develop from setuptools.command.install import install from subprocess import check_call class PostDevelopCommand(develop): """Post-installation for development mode.""" def run(self): check_call("apt-get install this-package".split()) develop.run(self) class PostInstallCommand(install): """Post-installation for installation mode.""" def run(self): check_call("apt-get install this-package".split()) install.run(self) setup( ...
추신 setuptools에는 사전 설치 항목이 없습니다. 왜 없는지 궁금해 할 때이 토론을 읽으십시오.
-
==============================
2.설치 후 스크립트에서 패키지 종속성이 이미 설치되어 있어야하는 경우이 전략이 저에게 효과적이었습니다.
설치 후 스크립트에서 패키지 종속성이 이미 설치되어 있어야하는 경우이 전략이 저에게 효과적이었습니다.
import atexit from setuptools.command.install import install def _post_install(): print('POST INSTALL') class new_install(install): def __init__(self, *args, **kwargs): super(new_install, self).__init__(*args, **kwargs) atexit.register(_post_install) setuptools.setup( cmdclass={'install': new_install},
-
==============================
3.해결 방법은 setup.py의 디렉토리에 post_setup.py를 포함시키는 것입니다. post_setup.py는 post-install을하는 함수를 포함 할 것이고, setup.py는 적절한 시간에 그것을 가져오고 시작할 것입니다.
해결 방법은 setup.py의 디렉토리에 post_setup.py를 포함시키는 것입니다. post_setup.py는 post-install을하는 함수를 포함 할 것이고, setup.py는 적절한 시간에 그것을 가져오고 시작할 것입니다.
setup.py에서 :
from distutils.core import setup from distutils.command.install_data import install_data try: from post_setup import main as post_install except ImportError: post_install = lambda: None class my_install(install_data): def run(self): install_data.run(self) post_install() if __name__ == '__main__': setup( ... cmdclass={'install_data': my_install}, ... )
post_setup.py :
def main(): """Do here your post-install""" pass if __name__ == '__main__': main()
디렉토리에서 setup.py를 시작한다는 일반적인 생각으로 post_setup.py를 가져올 수 있습니다. 그렇지 않으면 빈 함수가 시작됩니다.
post_setup.py에서 if __name__ == '__main__': 문을 사용하면 설치 후 명령 줄에서 수동으로 시작할 수 있습니다.
-
==============================
4.사후 설치를 수행하고 요구 사항을 유지하는 가장 쉬운 방법은 설치 호출을 꾸미는 것입니다 (...).
사후 설치를 수행하고 요구 사항을 유지하는 가장 쉬운 방법은 설치 호출을 꾸미는 것입니다 (...).
from setup tools import setup def _post_install(setup): def _post_actions(): do_things() _post_actions() return setup setup = _post_install( setup( name='NAME', install_requires=['... ) )
setup을 선언 할 때 setup ()이 실행됩니다. 요구 사항 설치가 끝나면 _post_install () 함수가 실행되어 _post_actions () 내부 함수가 실행됩니다.
-
==============================
5.@Apalala, @Zulu 및 @mertyildiran의 답변을 결합하십시오. 이것은 파이썬 3.5 환경에서 저에게 효과적이었습니다 :
@Apalala, @Zulu 및 @mertyildiran의 답변을 결합하십시오. 이것은 파이썬 3.5 환경에서 저에게 효과적이었습니다 :
import atexit import os import sys from setuptools import setup from setuptools.command.install import install class CustomInstall(install): def run(self): def _post_install(): def find_module_path(): for p in sys.path: if os.path.isdir(p) and my_name in os.listdir(p): return os.path.join(p, my_name) install_path = find_module_path() # Add your post install code here atexit.register(_post_install) install.run(self) setup( cmdclass={'install': CustomInstall}, ...
또한 일부 쉘 작업을 수행하기 위해 install_path에서 패키지의 설치 경로에 액세스 할 수 있습니다.
from https://stackoverflow.com/questions/20288711/post-install-script-with-python-setuptools by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 내가 추가 한 각 메소드에 대해 반복해서 타이핑하지 않고 클래스의 모든 기능을 어떻게 장식 할 수 있습니까? 파이썬 [복제] (0) | 2018.10.11 |
---|---|
[PYTHON] 커스텀 비교 술어를 가진 heapq (0) | 2018.10.11 |
[PYTHON] 교대로 두 목록을 결합하는 Pythonic 방식? (0) | 2018.10.11 |
[PYTHON] 리스트 독해력과 생성자 표현에서 산출 (0) | 2018.10.11 |
[PYTHON] TensorFlow에서 텐서를 수적으로 배열로 변환하려면 어떻게해야합니까? (0) | 2018.10.11 |