programing

Python 설정 도구를 사용한 설치 후 스크립트

powerit 2023. 7. 22. 10:32
반응형

Python 설정 도구를 사용한 설치 후 스크립트

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

python setup.py install

로컬 프로젝트 파일 보관소 또는

pip install <name>

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

년 전에 이 주제를 다룬 SO 답변을 접했는데, 당시에는 설치 하위 명령을 생성해야 한다는 의견이 일치했습니다.그래도 그렇다면 사용자가 스크립트를 실행하기 위해 두 번째 명령을 입력할 필요가 없도록 이 작업을 수행하는 방법에 대한 예를 누군가 제공할 수 있습니까?

참고: 아래 솔루션은 소스 배포 zip 또는 tarball을 설치하거나 소스 트리에서 편집 가능한 모드로 설치할 때만 작동합니다.바이너리 휠에서 설치할 때는 작동하지 않습니다(.whl)


이 솔루션은 보다 투명합니다.

다음에 몇 가지 추가 사항을 추가합니다.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):
        develop.run(self)
        # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION

class PostInstallCommand(install):
    """Post-installation for installation mode."""
    def run(self):
        install.run(self)
        # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION

및 삽입cmdclass에 대한 주장.setup()에서 기능하는.setup.py:

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 PreDevelopCommand(develop):
    """Pre-installation for development mode."""
    def run(self):
        check_call("apt-get install this-package".split())
        develop.run(self)

class PreInstallCommand(install):
    """Pre-installation for installation mode."""
    def run(self):
        check_call("apt-get install this-package".split())
        install.run(self)


setup(
    ...

추신: 설치 도구에서 사용할 수 있는 사전 설치 진입점이 없습니다.없는 이유가 궁금한 경우 이 토론을 읽으십시오.

참고: 아래 솔루션은 소스 배포 zip 또는 tarball을 설치하거나 소스 트리에서 편집 가능한 모드로 설치할 때만 작동합니다.바이너리 휠에서 설치할 때는 작동하지 않습니다(.whl)


설치 후 스크립트에서 패키지 종속성이 이미 설치되어 있어야 하는 경우 이 방법이 유일하게 효과적입니다.

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},

참고: 아래 솔루션은 소스 배포 zip 또는 tarball을 설치하거나 소스 트리에서 편집 가능한 모드로 설치할 때만 작동합니다.바이너리 휠에서 설치할 때는 작동하지 않습니다(.whl)


은 솔션은다포수있다니습함할을을 하는 것일 수.post_setup.pysetup.py의 디렉토리.post_setup.py 및 설치후수포기함다니합능을는행하를 하는 기능이 포함되어 있습니다.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__':명령문을 사용하면 명령줄에서 수동으로 설치 후를 시작할 수 있습니다.

@Apalalala, @Zulu 및 @mertyildiran의 답변을 결합하여 Python 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쉘 작업을 하기 위해서.

▁to▁▁the로 통화를 장식하는 것이라고 생각합니다.setup(...):

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().

출구를 사용하는 경우에는 새 cmd 클래스를 생성할 필요가 없습니다.설정() 호출 직전에 간단히 종료 레지스터를 만들 수 있습니다.그것은 같은 일을 합니다.

또한 종속성을 먼저 설치해야 하는 경우에는 pip 설치에서 작동하지 않습니다. pip이 패키지를 제자리로 이동하기 전에 atexit 핸들러가 호출되기 때문입니다.

제시된 권장 사항으로 문제를 해결할 수 없었기 때문에 도움이 된 것은 다음과 같습니다.

할 수 .setup()setup.py그런 식으로:

from setuptools import setup

def _post_install():
    <your code>

setup(...)

_post_install()

언급URL : https://stackoverflow.com/questions/20288711/post-install-script-with-python-setuptools

반응형