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.py
setup.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
'programing' 카테고리의 다른 글
머리글을 별도의 디렉토리에 배치해야 하는 이유는 무엇입니까? (0) | 2023.07.27 |
---|---|
Oracle -max_string_size가 표준인지 확장되었는지 확인하는 방법 (0) | 2023.07.27 |
단위 벡터가 필요한 이유(즉, 벡터를 정규화해야 하는 이유)는 무엇입니까? (0) | 2023.07.22 |
SQL MariaDB - 예외가 있는 모든 데이터베이스의 모든 테이블에 대해 이 쿼리 반복 (0) | 2023.07.22 |
csv는 왜 글을 쓰나요?writerow는 각 문자 뒤에 쉼표를 넣습니까? (0) | 2023.07.22 |