Python セットアップツールを使用したインストール後のスクリプト 質問する

Python セットアップツールを使用したインストール後のスクリプト 質問する

ユーザーが次のコマンドを実行できるように、インストール後の Python スクリプト ファイルを setuptools setup.py ファイルの一部として指定することは可能ですか?

python setup.py install

ローカルプロジェクトファイルアーカイブ、または

pip install <name>

PyPI プロジェクトの場合、スクリプトは標準の setuptools インストールの完了時に実行されますか? 単一の Python スクリプト ファイルでコード化できるインストール後のタスク (カスタムのインストール後のメッセージをユーザーに配信する、別のリモート ソース リポジトリから追加のデータ ファイルを取得するなど) を実行したいと考えています。

私は遭遇しました数年前のSOの回答それはそのトピックに対処しており、その時点では、インストール サブコマンドを作成する必要があるというコンセンサスがあったようです。それがまだ当てはまる場合、スクリプトを実行するためにユーザーが 2 番目のコマンドを入力する必要がないように、これを行う方法の例を誰か提供することは可能でしょうか?

ベストアンサー1

注記:以下の解決策は、ソース配布のzipまたはtarballをインストールする場合、またはソースツリーから編集モードでインストールする場合にのみ機能します。ないバイナリホイール(.whl)からインストールする場合に機能します


このソリューションはより透明性があります:

いくつかの追加を行うだけでsetup.py、追加のファイルは必要ありません。

また、インストール後には、開発/編集可能モード用とインストール モード用の 2 つの異なるインストールを考慮する必要があります。

これら2つのクラスを追加します。インストール後のスクリプト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(
    ...

PS:setuptoolsにはインストール前のエントリポイントはありません。この議論なぜ存在しないのか疑問に思う場合。

おすすめ記事