Apa yang setara dengan pip dari paket instalasi `npm --save-dev`?

199

Dalam nodejs, saya bisa melakukannya npm install package --save-dev untuk menyimpan paket yang diinstal ke dalam paket.

Bagaimana cara mencapai hal yang sama di manajer paket Python pip? Saya ingin menyimpan nama paket dan versinya menjadi, katakanlah, requirements.piptepat setelah menginstal paket menggunakan sesuatu seperti pip install package --save-dev requirements.pip.

Hllau
sumber
4
pip freeze > requirements.pip
falsetru
5
Ini tidak sama. npm install package --save-devmenggabungkan instalasi dan penambahan ke file persyaratan simpul_npm pada saat yang sama. Itu lebih berguna. Dengan pip freezesaya harus melakukan dua perintah untuk melakukan hal yang sama: 1) pip install package2)pip freeze > requirements.pip
hllau
1
Pip memiliki masalah tentang --saveopsi.
rutsky
Jika menggunakan setup.py untuk persyaratan, saya telah membuat modul kecil untuk membekukan versi paket Anda ke setup.py.
AdamGold

Jawaban:

164

Tidak ada yang setara dengan pip .

Cara terbaik adalah dengan pip install package && pip freeze > requirements.txt

Anda dapat melihat semua opsi yang tersedia di halaman dokumentasinya .

Jika itu benar-benar mengganggu Anda, tidak akan terlalu sulit untuk menulis skrip bash khusus ( pips) yang mengambil -sargumen dan membeku ke requirements.txtfile Anda secara otomatis.

Edit 1

Sejak menulis ini, tidak ada perubahan dalam menyediakan --save-devopsi otomatis yang mirip dengan NPM namun Kenneth Reitz (penulis requestsdan banyak lagi) telah merilis beberapa info lebih lanjut tentang alur kerja pip yang lebih baik untuk menangani pippembaruan dengan lebih baik .

Edit 2

Ditautkan dari artikel "alur kerja pip yang lebih baik" di atas, sekarang direkomendasikan untuk digunakan pipenvuntuk mengelola persyaratan dan lingkungan virtual. Setelah banyak menggunakan ini baru-baru ini saya ingin merangkum betapa sederhananya transisi ini:

Instal pipenv(di Mac)

brew install pipenv

pipenvmembuat dan mengelola lingkungan virtual itu sendiri sehingga dalam sebuah proyek dengan yang sudah ada requirements.txt, menginstal semua persyaratan (saya menggunakan Python3.7 tetapi Anda dapat menghapus --threejika Anda tidak) sesederhana:

pipenv --three install

Mengaktifkan virtualenv untuk menjalankan perintah juga mudah

pipenv shell

Persyaratan pemasangan akan secara otomatis memperbarui PipfiledanPipfile.lock

pipenv install <package>

Juga dimungkinkan untuk memperbarui paket-paket yang kedaluwarsa

pipenv update

Saya sangat merekomendasikan memeriksanya terutama jika berasal dari npmlatar belakang karena memiliki rasa yang mirip dengan package.jsondanpackage-lock.json

Ewan
sumber
22
Perhatikan bahwa ini juga akan menyimpan dependensi dependensi yang seiring waktu mungkin tidak diperlukan lagi karena dependensi menjatuhkan penggunaannya.
Patrick Bassut
Ini sepertinya tidak membahas aspek --save-dev dari pertanyaan awal yang memungkinkan Anda memiliki dependensi berbeda untuk pengembangan lokal vs produksi. Bagaimana Anda bisa mencapainya dengan pipenv?
jeznag
1
@ jeznag pipenvmemungkinkan Anda menentukan a dev-packagesdi Anda Pipfiledan / atau menggunakan --dev(atau -d) dari baris perintah. misalnyapipenv install --dev nose2
Ewan
39

Garis sederhana ini adalah titik awal. Anda dapat dengan mudah membuat perintah bash untuk menggunakan kembali PAKET di baris tersebut.

pip install PACKAGE && pip freeze | grep PACKAGE >> requirements.txt

Berkat @devsnd untuk contoh fungsi bash sederhana:

function pip-install-save { 
    pip install $1 && pip freeze | grep $1 >> requirements.txt
}

Untuk menggunakannya, jalankan saja:

pip-install-save some-package
Karim N Gorjux
sumber
Lima sen sayaP=Flask pip install $P && pip freeze | grep $P >> requirements.txt
GBrian
4

Saya telah membuat paket python yang membungkus pipm yang sebenarnya pipdisebut . Semua perintah akan berfungsi sebagaimana adanya, ditambah lagi akan tercermin dalam file persyaratan. Tidak seperti (alat serupa yang saya temukan dan tidak dapat digunakan) itu dapat menangani banyak file dan lingkungan (tes, dev, produksi, dll.). Ini juga memiliki perintah untuk memutakhirkan semua / semua dependensi Anda.pippip-save

instalasi

pipm install pkg-name

instalasi sebagai ketergantungan pengembangan

pipm install pkg-name --dev

instalasi sebagai ketergantungan pengujian

pipm install pkg-name --test

pemindahan

pipm uninstall pkg-name

perbarui semua dependensi Anda

pipm update

instal semua dependensi Anda dari file persyaratan

pipm install

termasuk dependensi pengembangan

pipm install --dev

Noortheen Raja
sumber
3

Pembaruan: tampaknya, pipenv tidak secara resmi didukung oleh pengelola Python , dan halaman yang ditautkan sebelumnya dimiliki oleh organisasi yang berbeda. Alat ini memiliki pro dan kontra, tetapi solusi di bawah ini masih mencapai hasil yang dicari OP.

pipenv adalah alat manajemen ketergantungan yang membungkus pipdan, antara lain, menyediakan apa yang Anda tanyakan:

https://pipenv.kennethreitz.org/en/latest/#example-pipenv-workflow

$ pipenv install <package>

Ini akan membuat Pipfile jika tidak ada. Jika ada, itu akan secara otomatis diedit dengan paket baru yang Anda berikan.

A Pipfileadalah padanan langsung dari package.json, sementara Pipfile.lockberkorespondensi dengan package-lock.json.

dskrvk
sumber
1

Anda dapat menyimpannya secara manual di Makefile (atau file teks dan kemudian diimpor dalam Makefile Anda):


PYTHON=.venv/bin/python # path to pyphon
PIP=.venv/bin/pip # path to pip
SOURCE_VENV=. .venv/bin/activate


install:
    virtualenv .venv
    $(SOURCE_VENV) && $(PIP) install -e PACKAGE
    $(SOURCE_VENV) && $(PIP) install -r requirements.txt # other required packages

dan kemudian jalankan make install

Evan Lévesque
sumber
Saya sangat setuju dengan pendekatan ini.
eleijonmarck
1

Saya menggunakan baris perintah kecil ini untuk menginstal paket dan menyimpan versinya di requirements.txt: pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt

Anthony Pierotti
sumber
0

Bagaimana kalau membuat fungsi shell untuk melakukan ini? Tambahkan kode di bawah ini ke ~/.profileatau~/.bashrc

pips() {
    local pkg=$1

    if [ -z "$1" ]; then
        echo "usage: pips <pkg name>"
        return 1
    fi

    local _ins="pip install $pkg"
    eval $_ins
    pip freeze | grep $pkg -i >> requirements.txt
}

kemudian jalankan source ~/.profileatau source ~/.bashrcuntuk mengimpornya ke terminal Anda saat ini

ketika Anda ingin menginstal && menyimpan paket, jalankan saja, misalnya pips requests. setelah paket diinstal, versinya akan disimpan ke requirements.txtdalam direktori Anda saat ini.

Anyany Pan
sumber