車茪の䞊のパむ゜ン

Pythonのパッケヌゞシステムむンフラストラクチャは、開発者ずシステム管理者の䞡方から長い間批刀されおきたした。 長い間、コミュニティ自䜓でさえ、特定のケヌスごずにどの噚具を䜿甚するかに぀いお合意できたせんでした。 Distutils、setuptools、distribute、distutils2は、基本的な配垃メカニズムずしお既に存圚し、virtualenv、buildout、easy_install、およびpipは、この混乱をすべお管理するための高レベルのツヌルずしお存圚したす。



setuptools以前は、䞻な配垃圢匏は゜ヌスファむルたたはWindows甚のバむナリMSI配垃でした。 Linuxでは、 bdist_dumb



ずbdist_rpm



は最初は壊れおいたしたが、これはRed Hatベヌスのシステムでのみ機胜したした。 しかし、 bdist_rpm



さえ、人々が䜿甚を開始するには十分にbdist_rpm



したせんでした。



数幎前、 PJEはdistutilsを改善し、Pythonパッケヌゞにメタデヌタを远加するために、setuptoolsずpkg_resourcesの混合物を提䟛するこずにより、この問題を修正しようずしたした。 これに加えお、圌はそれらをむンストヌルするeasy_installナヌティリティを曞きたした。 メタデヌタをサポヌトする配垃圢匏がないため、「卵」圢匏が提䟛されおいたした。



Python eggは、pythonパッケヌゞず必芁なメタデヌタを含む通垞のzipアヌカむブです。 倚くの人がたたに卵を意図的に収集したこずはないでしょうが、メタデヌタの圢匏はただ健圚です。 そしお、誰もがsetuptoolsを䜿甚しおプロゞェクトを展開しおいたす。



残念ながら、しばらくしお、コミュニティは分裂し、その䞀郚はバむナリ圢匏、特に「卵」の消滅を宣蚀したした。 その埌、easy_installを眮き換えるpipは、egg圢匏の受け入れを停止したした。



それからもう少し時間が経ち、バむナリパッケヌゞの拒吊が䞍䟿を匕き起こし始めたした。 人々はたすたすクラりドサヌバヌに展開し始め、各マシンでC-shnyラむブラリを再コンパむルする必芁性はあたり喜ばしくありたせん。 圓時の「卵」はあいたいだったので私はそう思う、それらは新しいPEPでやり盎され、「 ホむヌル 」ず呌ばれたした。



さらに、すべおのアクションがvirtualenv環境で行われるず想定されおいたす 。



どんなホむヌル



簡単なものから始めたしょう。 「ホむヌル」ずは䜕ですか、たた「卵」ずどう違うのですか どちらの圢匏もzipファむルです。 䞻な違いは、卵は開梱せずにむンポヌトできるのに察し、ホむヌルは開梱する必芁があるこずです。 車茪を茞入䞍可にする技術的な理由はありたせんが、盎接茞入のサポヌトは蚈画されおいたせん。



もう1぀の違いは、「卵」にはコンパむル枈みのバむトコヌドが含たれるのに察し、「ホむヌル」には含たれないこずです。 これの䞻な利点は、libpythonを介しおリンクされたモゞュヌルを配垃する必芁があるたで、Pythonのバヌゞョンごずに個別のホむヌルを䜜成する必芁がないこずです。 Python 3の新しいバヌゞョンでは、安定したABIを䜿甚しおいたすが、これもすでに匷化されおいたす。



ただし、ホむヌル圢匏にも問題がないわけではなく、その䞀郚は「卵」から継承しおいたす。 たずえば、Linuxでのバむナリディストリビュヌションは、Python自䜓がさたざたな圢匏でLinuxでコンパむルされるこずず、モゞュヌルがさたざたなシステムラむブラリにリンクするずいう2぀の欠点があるため、ほずんどの堎合ただ受け入れられたせん。 最初の問題は、Python 2USC2ずUSC4の互換性のないバヌゞョンの共存が原因です。 ABIは、コンパむルモヌドに応じお倉わりたす。 珟圚、ホむヌル私が知る限りには、ラむブラリが関連付けられおいるUnicodeモヌドに関する情報が含たれおいたせん。 別の問題は、Linuxディストリビュヌションの互換性が私たちが望んでいるよりも䜎いこずであり、状況によっおは、あるディストリビュヌション甚にコンパむルされたアセンブリが他のディストリビュヌションで動䜜しないこずがありたす。



これはすべお、䞀般的に蚀えば、珟時点では、バむナリ「ホむヌル」をさたざたなシステムずの互換性がないずしおPyPIにアップロヌドできないずいう事実に倉換されたす。



これらすべおに加えお、ホむヌルは、バむナリパッケヌゞず玔粋なpythonコヌドを含むパッケヌゞずいう2぀の極端な点のみを認識したす。 バむナリパッケヌゞは、Pythonブランチ2.xに固有です。 これは、2.xサむクルが終わりに近づいおいるため、倧きな問題ではないように思われたす。たた、2.7でのみ収集されたパッケヌゞは、長い間十分です。 しかし、Python 2.8が突然登堎した堎合、このパッケヌゞはPythonのバヌゞョンに䟝存しないが、バむナリが含たれおいるため、アヌキテクチャに䟝存せざるを埗ないずいうのは興味深いこずです。



そのようなパッケヌゞの存圚を正圓化する唯䞀のケヌスは、CFFIからctypesでロヌドされた分散ラむブラリが含たれおいる堎合です。 このようなラむブラリはlibpythonを介しおリンクされおおらず、蚀語実装から独立しおいたすpypyでも䜿甚できたす。



しかし、明るい面がありたす。独自の同皮のむンフラストラクチャでのバむナリホむヌルの䜿甚を犁止するものはありたせん。



ホむヌルアセンブリ



これで、ホむヌルずは䜕かがわかりたした。 独自の「ホむヌル」の䜜り方 独自のラむブラリから組み立おるのが最も簡単なプロセスです。 必芁なのは、最新バヌゞョンのsetuptools



ずwheel



ラむブラリだけです。 䞡方がむンストヌルされるず、次のコマンドで「ホむヌル」が組み立おられたす。

 $ python setup.py bdist_wheel
      
      





ホむヌルはパッケヌゞディレクトリに䜜成されたす。 ただし、泚意が必芁なこずが1぀ありたす。バむナリの配垃です。 デフォルトでは、アセンブルされた「ホむヌル」setup.pyでバむナリステップが䜿甚されおいないこずを前提ずしおいたすは、玔粋なPythonコヌドで構成されおいたす。 これは、パッケヌゞの䞀郚ずしお.so



、 .dylib



たたは.dll



を配垃した堎合でも、結果の「ホむヌル」はプラットフォヌムに䟝存しないように芋えるこずを意味したす。



この問題を解決するには、setuptoolsからDistributionを手動で実装し、玔床フラグをfalse



スロヌしfalse



。

 import os from setuptools import setup from setuptools.dist import Distribution class BinaryDistribution(Distribution): def is_pure(self): return False setup( ..., include_package_data=True, distclass=BinaryDistribution, )
      
      





ホむヌル蚭定



最新バヌゞョンのpipを䜿甚しお、「ホむヌル」は次のように蚭定されたす。

 $ pip install package-1.0-cp27-none-macosx_10_7_intel.whl
      
      





しかし、䟝存関係はどうですか いく぀かの困難がありたす。 通垞、パッケヌゞの芁件の1぀は、むンタヌネットに接続しおいなくおもむンストヌルできるこずです。 幞いなこずに、pipを䜿甚するず、むンデックスからの読み蟌みを無効にし、むンストヌルする必芁があるすべおのものを含むディレクトリをむンストヌルできたす。 必芁なバヌゞョンのすべおの䟝存関係のホむヌルがある堎合は、次を実行できたす。

 $ pip install --no-index --find-links=path/to/wheels package==1.0
      
      





これ1.0



パッケヌゞpackage



バヌゞョン1.0



仮想環境にむンストヌルされたす。



䞭毒甚ホむヌル



さお、しかし、すべおの䟝存関係に.whlがない堎合はどうでしょうか 理論䞊のピップにより、 wheel



コマンドを䜿甚しおこの問題を解決できたす。 これは次のように動䜜したす

 pip wheel --wheel-dir=path/to/wheels package==1.0
      
      





このコマンドは、指定したフォルダヌに䟝存するパッケヌゞのすべおのパッケヌゞをアンロヌドしたす。 しかし、いく぀かの問題がありたす。

1぀は、チヌムには珟圚、既に「ホむヌル」である䟝存関係をアンロヌドしないバグがあるずいうこずです。 そのため、PyPIでホむヌル圢匏の䟝存関係が既に利甚可胜な堎合、ロヌドされたせん。



これは、ダりンロヌドしたホむヌルをキャッシュから手動で移動するシェルスクリプトによっお䞀時的に解決されたす。

 #!/bin/sh WHEEL_DIR=path/to/wheels DOWNLOAD_CACHE_DIR=path/to/cache rm -rf $DOWNLOAD_CACHE_DIR mkdir -p $DOWNLOAD_CACHE_DIR pip wheel --use-wheel -w "$WHEEL_DIR" -f "$WHEEL_DIR" \ --download-cache "$DOWNLOAD_CACHE_DIR" package==1.0 for x in "$DOWNLOAD_CACHE_DIR/"*.whl; do mv "$x" "$WHEEL_DIR/${x##*%2F}" done
      
      





2番目の問題はもう少し深刻ですPyPIにない堎合、pipはどのようにしお独自のパッケヌゞを芋぀けるのですか そうです、䜕もありたせん。 この堎合、ドキュメントでは、 pip wheel package



ではなく、 pip wheel -r requirements.txt



を䜿甚するこずを掚奚しおいpip wheel -r requirements.txt



。ここで、 requirements.txt



には必芁な䟝存関係がすべお含たれおいたす。



DevPIを䜿甚したパッケヌゞの構築



䟝存関係の問題に察するこのような䞀時的な解決策は、単玔な状況では非垞に圓おはたりたすが、盞互に䟝存する内郚Pythonパッケヌゞが倚数ある堎合はどうでしょうか。 この蚭蚈はすぐに厩壊したす。



幞いなこずに、昚幎、Holker KrekelはDevPIず呌ばれるこの灜害に察する゜リュヌションを䜜成したした。これは基本的に、PyPIでpipの動䜜を゚ミュレヌトするハックです。 DevPIはコンピュヌタヌにむンストヌルされるず、PyPIの前に透過プロキシずしお機胜し、pipがロヌカルリポゞトリからパッケヌゞをむンストヌルできるようにしたす。 さらに、PyPIからダりンロヌドされたすべおのパッケヌゞは自動的にキャッシュされるため、ネットワヌクを切断しおも、これらのパッケヌゞはむンストヌルできたす。 そしお、最終的に、パブリックむンデックスに保存されおいるパッケヌゞず同じ方法でそれらを参照するために、ロヌカルサヌバヌに独自のパッケヌゞをアップロヌドするこずが可胜になりたす。



ロヌカルのvirtualenvにDevPIをむンストヌルするこずをお勧めしdevpi-server



。 devpi



、 PATH



にdevpi-server



ずdevpi



ぞのリンクを远加したす。

 $ virtualenv devpi-venv $ devpi-venv/bin/pip install --upgrade pip wheel setuptools devpi $ ln -s `pwd`/devpi-venv/bin/devpi ~/.local/bin $ ln -s `pwd`/devpi-venv/bin/devpi-server ~/.local/bin
      
      





その埌、 devpi-server



を起動するために残り、手動で停止するたで機胜したす。

 $ devpi-server --start
      
      





起動埌、䞀床初期化する必芁がありたす。

 $ devpi use http://localhost:3141 $ devpi user -c $USER password= $ devpi login $USER --password= $ devpi index -c yourproject
      
      





私は「自分甚」にDevPIを䜿甚しおいるため、DevPIのナヌザヌ名ずシステムのナヌザヌ名は同じです。 最埌のステップで、プロゞェクトの名前でむンデックスが䜜成されたす必芁に応じお、耇数䜜成できたす。



pipをロヌカルリポゞトリにリダむレクトするには、環境倉数を゚クスポヌトできたす。

 $ export PIP_INDEX_URL=http://localhost:3141/$USER/yourproject/+simple/
      
      





このコマンドをpostactivate



スクリプトに入れお、誀ったむンデックスからの偶発的なロヌドを防ぎたす。



ロヌカルのDevPIに独自のホむヌルを配眮するには、 devpi



ナヌティリティをdevpi



たす。

 $ devpi use yourproject $ devpi upload --no-vcs --formats=bdist_wheel
      
      





--no-vcs



は、バヌゞョン管理システムを識別しようずするマゞックを無効にし、最初にいく぀かのファむルを移動したす。 私のプロゞェクトでは、VCSに含たれおいないファむルバむナリなどが配垃されおいるため、これは必芁ありたせん。



最終的に、PyPIが拒吊し、DevPIがsetup.py resease



誀っおコヌドをオヌバヌロヌドしないように、setup.pyファむルを分割するこずを匷くお勧めしたす。 これを行う最も簡単な方法は、誀ったPyPI分類子を远加するこずです。

 setup( ... classifier=['Private :: Do Not Upload'], )
      
      





たずめ



これで、すべおが内郚䟝存関係を䜿甚し、独自の「ホむヌル」を組み立お始める準備ができたした。 衚瀺されたらすぐに、アヌカむブし、別のサヌバヌにダりンロヌドしお、別のvirtualenvにむンストヌルできたす。

pip wheel



が既存のwheelパッケヌゞを無芖しなくなるず、プロセス党䜓が少し簡単になりたす。 それたでの間、䞊蚘のシェルスクリプトは最悪の解決策ではありたせん。



「卵」ず比范しお



ホむヌル圢匏は、eggよりも魅力的です。 開発がより掻発になり、PyPIがサポヌトを远加し始め、ナヌティリティがそれを䜿い始めるので、それが最良の゜リュヌションのように芋えたす。 「卵」はこれたでのずころeasy_installでのみサポヌトされおいたすが、ほずんどは長い間pipに切り替えたした。



Zopeコミュニティはただ最倧の卵ベヌスおよびビルドアりトベヌスのコミュニティだず思いたす。 そしお、「卵」に基づいた゜リュヌションがあなたの堎合に適甚できるなら、それを適甚すべきだず思いたす。 倚くの人は卵をたったく䜿甚せず、virtualenvを䜜成し、アヌカむブしお別のサヌバヌに送信するこずを奜みたす。 異なるサヌバヌには異なるラむブラリパスがある可胜性があるため、このような展開の堎合、wheelsが最適な゜リュヌションです。 virtualenvのビルドサヌバヌで.pyc



ファむルが䜜成され、これらのファむルに特定のファむルパスが含たれるずいう問題がありたした。 wheel .pyc



を䜿甚するず、仮想環境ぞのむンストヌル埌に䜜成され、自動的に正しいパスが蚭定されたす。



だから今、あなたはそれを持っおいたす。 車茪の䞊のPython。 そしお、それは䞀皮の機胜であり、おそらく時間を費やす䟡倀がありたす。



All Articles