복붙노트

[PYTHON] 파이썬 setuptools로 설치 후 스크립트

PYTHON

파이썬 setuptools로 설치 후 스크립트

사용자가 다음 명령을 실행할 수 있도록 설치 후 Python 스크립트 파일을 setuptools setup.py 파일의 일부로 지정할 수 있습니까?

python setup.py install

로컬 프로젝트 파일 아카이브 또는

pip install <name>

PyPI 프로젝트에서 스크립트는 표준 setuptools 설치 완료시 실행됩니까? 단일 Python 스크립트 파일 (예 : 사용자에게 사용자 정의 설치 후 메시지 전달, 다른 원격 소스 저장소에서 추가 데이터 파일 가져 오기)로 코딩 할 수있는 설치 후 작업을 수행하려고합니다.

나는 몇 년 전에이 주제를 다룬이 SO 답을 찾았고 그 당시의 합의가 install 부속 명령을 작성해야한다고 생각하는 것처럼 들린다. 그렇다면 스크립트를 실행하기 위해 두 번째 명령을 입력 할 필요가 없도록 누군가가이 작업을 수행하는 방법에 대한 예제를 제공 할 수 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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에서 패키지의 설치 경로에 액세스 할 수 있습니다.

  6. from https://stackoverflow.com/questions/20288711/post-install-script-with-python-setuptools by cc-by-sa and MIT license