コードのパッケージ化¶
コードをパッケージ化して、他の開発者と共有します。例えば、他の開発者が自分のアプリケーションで使うためのライブラリや、 ‘py.test’ のような開発ツールを共有するためです。
PyPIやpipなどのツールによる配布方法の利点は、他の開発者達にあなたのパッケージのインストールとダウンロード、カジュアルな実験、大規模で専門的なシステムの一部としての使用を簡単に行え、エコシステムとして確立されています。
この方法でPythonコードを共有するのは、定評のある規約です。コードがPyPIにパッケージ化されていない場合、他の開発者がコードを見つけて既存のプロセスの一部として使用することは難しくなります。彼らは、このようなプロジェクトについては、管理や放棄の疑いが強いとみなします。
このようにコードを配布することの欠点は、必要なバージョンのPythonをインストールする方法と、pyなどのツールを使用してコードの他の依存関係をインストールすることができることを受信者が理解していることです。 これは他の開発者に配布する場合は問題ありませんが、この方法はアプリケーションをエンドユーザーに配布する場合には不適切です。
Pythonパッケージングガイド には、Pythonパッケージの作成と保守に関する広範なガイドがあります。
パッケージングの代替案¶
アプリケーションをエンドユーザに配布するには、以下を行う必要があります。 freeze your application
Linuxでは、Linuxディストリビューションパッケージ の作成 (例:DebianやUbuntu用の.debファイル) を参考にしてください。
Pythonデベロッパー向け¶
オープンソースのPythonモジュールを書いているなら、PyPI と呼ばれ、よりよく知られている The Cheeseshop は、それをホストする場所です。
パーソナルPyPI¶
PyPI以外のソースからパッケージをインストールする場合(例えば、パッケージが proprietary の場合)、インストールが必要なパッケージを保持するディレクトリから実行される単純なhttpサーバをホストすることによって実行できます。
例を示すことは常に有益です
たとえば、 MyPackage.tar.gz
という名前のパッケージをインストールし、それがあなたのディレクトリ構造であると仮定すると:
- archive
- MyPackage
- MyPackage.tar.gz
コマンドプロンプトで次のように入力します:
$ cd archive
$ python -m SimpleHTTPServer 9000
これは、ポート9000で実行される単純なhttpサーバーを実行し、MyPackage などのすべてのパッケージをリストします。 これで、Pythonパッケージインストーラを使用して MyPackage をインストールできます。 Pipを使用すると、次のようになります。
$ pip install --extra-index-url=http://127.0.0.1:9000/ MyPackage
パッケージ名と同じ名前のフォルダを持つことは、ここでは 非常に重要です。 私は一度それに騙された。 しかし、MyPackage
という名前のフォルダを作成し、MyPackage.tar.gz
を 冗長 にしておくと、MyPackageをインストールすることができます:
$ pip install http://127.0.0.1:9000/MyPackage.tar.gz
pypiserver¶
Pypiserver はPyPI互換の最小限のサーバです。 これは、easy_installまたはpipにパッケージのセットを提供するために使用することができます。 管理コマンド(-U
)のような便利な機能が含まれており、すべてのパッケージをPyPI上の最新バージョンに更新します。
S3-Hosted PyPi¶
パーソナルPyPiサーバのための簡単なオプションの1つは、Amazon S3を使用することです。これの前提条件は、S3バケットを備えたAmazon AWSアカウントを持っていることです。
- PyPiまたは別のソースからすべての要件をインストールする
- pip2piをインストールする
pip install git+https://github.com/wolever/pip2pi.git
- pip2tgzおよびdir2piコマンドの場合はpip2pi READMEに従ってください。
pip2tgz packages/ YourPackage
(orpip2tgz packages/ -r requirements.txt
)dir2pi packages/
- 新しいファイルをアップロードする
- Cyberduckのようなクライアントを使って
packages
フォルダ全体をs3バケットに同期させます - あなたは必ず
packages/simple/index.html
と全ての新しいファイルとディレクトリをアップロードしてください
- 新しいファイルのアクセス許可を修正する
- デフォルトでは、S3バケットに新しいファイルをアップロードすると、不正なアクセス権が設定されます。
- Amazon Webコンソールを使用して、ファイルのREAD権限をEVERYONEに設定します。
- パッケージをインストールしようとしたときにHTTP 403が表示された場合は、アクセス権を正しく設定してください。
- すべて完了
- あなたは今あなたのパッケージをインストールすることができます
pip install --index-url=http://your-s3-bucket/packages/simple / YourPackage
Linuxディストリビューションの場合¶
Linuxディストリパッケージを作成することは、間違いなくLinux上でコードを配布する「正しい方法」です。
ディストリビューションパッケージにはPythonインタプリタが含まれていないので、ダウンロード約2MBをインストールします freezing your application
また、ディストリビューションがPython用の新しいセキュリティアップデートをリリースすると、その新しいバージョンのPythonを使ってアプリケーションが自動的に起動します。
bdist_rpmコマンドは、Red HatやSuSEのようなディストリビューションで使用する RPMファイルを生成すること は簡単です。
しかし、各ディストリビューションのフォーマット(Debian / Ubuntuの場合は.deb、RedHat/Fedoraの場合は.rpmなど)に必要なさまざまな設定を作成し、維持することは相当量の作業です。コードが他のプラットフォームで配布する予定のアプリケーションである場合は、WindowsとOSX用にアプリケーションをフリーズするために必要な別の設定を作成して維持する必要があります。クロスプラットフォーム フリーズツール のいずれかのために、Linuxのすべてのディストリビューションのためのスタンドアロンの実行可能ファイルを生成する単一の設定を作成して維持するだけでは、 WindowsとOSXだけでなく、
配布パッケージを作成することは、あなたのコードが現在配布物でサポートされていないバージョンのPython用である場合にも問題になります。 Ubuntuエンドユーザの いくつかのバージョン に ‘dead-snakes’ PPA sudo apt-repository を追加する必要があることを伝える必要があります コマンドを使用して.debファイルをインストールする前に、非常に敵対的なユーザーエクスペリエンスを作ります。 それだけでなく、すべてのディストリビューションでこれらの手順に相当するカスタムを維持しなければならず、さらに悪いことに、ユーザーに読んで理解させ、行動させる必要があります。
すべてのことを言って、ここでそれを行う方法です:
便利なツール¶
- fpm
- alien
- dh-virtualenv (APT/DEBオムニバスパッケージング用)