25

前文: パッケージ配布には Python setuptools が使用されます。my_packageいくつかのパッケージを含む Python パッケージ ( と呼びましょう) がありextra_requireます。extra_requireすべてがpythonパッケージ自体であり、pipがすべてを正しく解決したため、すべてが機能します(パッケージのインストールとビルド、および要求された場合は追加機能) 。シンプルなpip install my_package魅力のように働いた。

セットアップ: さて、エクストラの 1 つ ( と呼びましょうextra1) として、Python 以外のライブラリのバイナリを呼び出す必要がありますX

モジュールX自体 (ソース コード) がmy_packageコードベースに追加され、ディストリビューションに含まれていましたmy_package。悲しいことに、利用するには、最初にターゲットマシンでバイナリにコンパイルする必要があります(C ++実装。このようなコンパイルは、インストールXのビルド段階で行われると想定しています)。さまざまなプラットフォームのコンパイル用に最適化されたライブラリにmy_packageがあるため、必要なのは、ビルド プロセスの実行時にライブラリのそれぞれのディレクトリで実行することだけです。MakefileXmakeXmy_package

質問 #1 : setuptools/distutils を使用して、パッケージのビルド プロセス中にターミナル コマンド (つまり、make私の場合)を実行する方法を教えてください。

質問 #2extra1 :インストール プロセス中に対応するコマンドが指定された場合にのみ、そのような端末コマンドが実行されるようにするにはどうすればよいですか?

例:

  1. 誰かが実行した場合pip install my_package、そのようなライブラリの追加コンパイルXは発生しません。
  2. 誰かが を実行した場合pip install my_package [extra1]、モジュールXをコンパイルする必要があるため、対応するバイナリが作成され、ターゲット マシンで使用できるようになります。
4

2 に答える 2

3

残念ながら、setup.py と pip の間のやり取りに関するドキュメントはほとんどありませんが、次のようなことができるはずです。

import subprocess

from setuptools import Command
from setuptools import setup


class CustomInstall(Command):

    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        subprocess.call(
            ['touch',
             '/home/{{YOUR_USERNAME}}/'
             'and_thats_why_you_should_never_run_pip_as_sudo']
        )

setup(
    name='hack',
    version='0.1',
    cmdclass={'customcommand': CustomInstall}
)

これにより、コマンドを使用して任意のコードを実行するためのフックが提供され、さまざまなカスタム オプションの解析もサポートされます (ここでは説明しません)。

これをsetup.pyファイルに入れて、これを試してください:

pip install --install-option="customcommand" .

このコマンドは、メインのインストール シーケンスのに実行されることに注意してください。そのため、実行しようとしている内容によっては、機能しない場合があります。詳細な pip install 出力を参照してください。

(.venv) ayoon:tmp$ pip install -vvv --install-option="customcommand" .
/home/ayoon/tmp/.venv/lib/python3.6/site-packages/pip/commands/install.py:194: UserWarning: Disabling all use of wheels due to the use of --build-options / -
-global-options / --install-options.                                                                                                                        
  cmdoptions.check_install_build_global(options)
Processing /home/ayoon/tmp
  Running setup.py (path:/tmp/pip-j57ovc7i-build/setup.py) egg_info for package from file:///home/ayoon/tmp
    Running command python setup.py egg_info
    running egg_info
    creating pip-egg-info/hack.egg-info
    writing pip-egg-info/hack.egg-info/PKG-INFO
    writing dependency_links to pip-egg-info/hack.egg-info/dependency_links.txt
    writing top-level names to pip-egg-info/hack.egg-info/top_level.txt
    writing manifest file 'pip-egg-info/hack.egg-info/SOURCES.txt'
    reading manifest file 'pip-egg-info/hack.egg-info/SOURCES.txt'
    writing manifest file 'pip-egg-info/hack.egg-info/SOURCES.txt'
  Source in /tmp/pip-j57ovc7i-build has version 0.1, which satisfies requirement hack==0.1 from file:///home/ayoon/tmp
Could not parse version from link: file:///home/ayoon/tmp
Installing collected packages: hack
  Running setup.py install for hack ...     Running command /home/ayoon/tmp/.venv/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-j57ovc7
i-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --
record /tmp/pip-_8hbltc6-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/ayoon/tmp/.venv/include/site/python3
.6/hack customcommand                                                                                                                                       
    running install
    running build
    running install_egg_info
    running egg_info
    writing hack.egg-info/PKG-INFO
    writing dependency_links to hack.egg-info/dependency_links.txt
    writing top-level names to hack.egg-info/top_level.txt
    reading manifest file 'hack.egg-info/SOURCES.txt'
    writing manifest file 'hack.egg-info/SOURCES.txt'
    Copying hack.egg-info to /home/ayoon/tmp/.venv/lib/python3.6/site-packages/hack-0.1-py3.6.egg-info
    running install_scripts
    writing list of installed files to '/tmp/pip-_8hbltc6-record/install-record.txt'
    running customcommand
done
  Removing source in /tmp/pip-j57ovc7i-build
Successfully installed hack-0.1
于 2017-03-25T06:18:43.677 に答える