2013-11-15 38 views
31

pipでパッケージをインストールする方法を探していて、そのパッケージのバージョン情報をプロジェクトのrequirements.txtファイルに書き込んでいます。 npmに精通している人にとっては、それは本質的にはnpm install --saveです。パッケージをインストールしてpipでrequirements.txtに書き込む

pip freeze > requirements.txtを使用すると、うまく動作しますが、これを実行するのを忘れてしまったことがあります。あるいは、私がテスト用にインストールした未使用のパッケージを誤って含むことがあります。

したがって、次の擬似コード:

$ pip install nose2 --save 

が持つrequirements.txtファイルにつながる:私はバージョン番号をつかむために、保存の出力をのmungeことができると思い

nose2==0.4.7 

が、私簡単な方法があることを望んでいる。 Akashさんに基づく

pips django-waffle 

+1

bashを書き、コマンドライン引数を渡します。 'echo $ 1 >> requirements.txt; pip install $ 1' –

+2

これは完全な解決策ではありません.pipフリーズのようにバージョンが正しく解決されないからです。 – dusktreader

答えて

11

バージョン情報を取得するには、実際にインストール後にpip freezeを選択的に使用することができます。

pip_install_save() { 
    package_name=$1 
    requirements_file=$2 
    if [[ -z $requirements_file ]] 
    then 
     requirements_file='./requirements.txt' 
    fi 
    pip install $package_name && pip freeze | grep -i $package_name >> $requirements_file 
} 

grepコマンドに-iを付けてください。次の点に注意してください。 Pipはパッケージ名で大文字と小文字を区別しないので、おそらくそれが必要です。

+1

そのgrepステートメントは、要件ファイル内の項目を複製する可能性があります。 'django-example-package'が既にあなたの必要条件にあって' django'をインストールしていれば、これで、要件ファイルの最後にdjango-example-packageが追加されます。 –

+0

そのエッジケースは、正規表現で少し気をつけて扱うことができます。私は機能が壊れる可能性がある他の方法があると確信していますが、それは良いスタートだと思います。 – dusktreader

+1

@dusktreader私は '^ $ package_name =='を使用しました。しかし編集はまだプレレビューを待っている。 –

4

だけでパッケージをインストールし、requirements.txtにそれが名前だ 例を節約するためにあなたの.bashrcまたは.bash_profileのと使用ピップに

function pips() { 
    echo $'\n'$1 >> requirements.txt; pip install $1 
} 

のようになめらかにコマンドを追加しますKothawale comment:

+1

これはパッケージの名前をrequirements.txtに追加することを解決しますが、私の質問:) –

3

私が使っている以下のbash関数を書いています。

function pip-save() { 
    for pkg in [email protected]; do 
     pip install "$pkg" && { 
      name="$(pip show "$pkg" | grep Name: | awk '{print $2}')"; 
      version="$(pip show "$pkg" | grep Version: | awk '{print $2}')"; 
      echo "${name}==${version}" >> requirements.txt; 
     } 
    done 
} 

これにより、インストールされているバージョンだけでなく、標準パッケージ名も要件に保存されます。使用例

$ pip-save channels asgi_redis 
# will save the following to requirements.txt (as of writing): 
# --- 
# channels==1.0.1 
# asgi-redis==1.0.0 
# --- 
# note how asgi_redis is translated to its canonical name `asgi-redis` 
+0

複数の質問に同じ回答を投稿しないでください!質問に実際に全く同じ回答がある場合は、そのうちの1つが重複しているため、そのように終了するようにフラグを立てる必要があります。 – miken32

+0

@ miken32私は同意しません。私はこれがこれまでの最高の答えだと思う。 –

+0

@AlexCory私はそれに間違いがあったとは言わなかった。質問間で回答をコピーして貼り付けるのは良い方法ではありません。 – miken32

関連する問題