2016-07-07 9 views
3

私はいくつかの依存関係を持つpythonプロジェクトを持っています(setup.pyのinstall_requiresで定義されています)。私のopsの人々はパッケージが自己完結型であることを必要とし、Pythonのインストールのみに依存します。リトマステストは、彼らがzipファイルを入手してインターネット接続なしで解凍して実行できるということでしょう。依存関係を持つPythonプロジェクトをパッケージ化する標準的な方法は何ですか?

依存関係を含むインストールを簡単にパッケージ化する方法はありますか?それは、最終的に実行されるOS /アーキテクチャを構築しなければならない場合は許容されます。

setup.py buildsetup.py sdistの両方を試してみましたが、依存関係が含まれていないため、法案に適合していないようです。私はvirtualenv(絶対に必要な場合にインストールすることもできます)と考えましたが、ハードコーディングされたパスがあり、理想的ではありません。

+0

標準的な方法はありません。 – cel

+0

requirements.txtを依存関係とともに使用しないのはなぜですか?または 'pip install -r requirements.txt'を実行しても問題ありませんか? – valignatev

+0

私は、バンドルされた実行可能ファイルを作成しなければならないと思うので、さまざまなツールがあります。ところで、もしあなたが "devops people"を持っていて、自分自身を配備することはできないなら、* devops *ではありません。 – jonrsharpe

答えて

4

をどのようにピップ作品にはいくつかのニュアンスがありますが、ビルドマシンで。残念ながら、--prefix vendorを使用して、プロジェクトのすべての依存関係を保存することは、それらの依存関係のいずれか、または依存関係の依存関係がpipが見つける場所にインストールされていれば機能しません。これらの依存関係はスキップされ、残りの部分はvendorフォルダにインストールされます。

これまで私はこの問題を解決するためにvirtualenvの--no-site-packagesオプションを使用しました。ある会社では、pythonバイナリを含むvirtualenv全体を出荷します。依存関係の配送のみを目的として、virtualenvを使って--prefixスイッチを組み合わせることで、適切な場所にインストールするきれいな環境を提供できます。

私は一時的なvirtualenvを作成し、それをアクティブにしてからローカルのvendorフォルダーに依存関係をインストールするサンプルスクリプトを提供します。これは、CIで実行している場合に便利です。

#!/bin/bash 

tempdir=$(mktemp -d -t project.XXX) # create a temporary directory 
trap "rm -rf $tempdir" EXIT   # ensure it is cleaned up 
# create the virtualenv and exclude packages outside of it 
virtualenv --python=$(which python2.7) --no-site-packages $tempdir/venv 
# activate the virtualenv 
source $tempdir/venv/bin/activate  
# install the dependencies as above 
pip install -r requirements.txt --prefix=vendor 
1

ほとんどの場合、すべての依存関係を「ベンダー」できる必要があります。これは基本的にはvirtualenvの粗いバージョンです。

たとえば、パッケージincludes chardet and urllib3を独自のソースツリーに表示します。 https://gist.github.com/proppy/1136723

依存関係がインストールされたら、from .some.namespace import dependency_nameでそれらを参照して、ローカルバージョンを使用していることを確認することができます。

0

最近のバージョンのpip(これは8.1.2を使用しています)でこれを行うことができます。その後

pip install -r requirements.txt --prefix vendor 

それを実行します:

PYTHONPATH=vendor/lib/python2.7/site-packages python yourapp.py 

(。!これは基本的に@valentjediコメントの拡張であるおかげで)

+0

この '--prefix vendor'はベンダー名の追加と関係がないようですが、パッケージをインストールするフォルダを指定するだけです。 – ThorSummoner

+0

正しいです、それは販売された依存関係を入れるフォルダの名前です。 –

関連する問題