Pip tương đương với gói cài đặt `npm --save-dev` là gì?


199

Trong nodejs, tôi có thể làm npm install package --save-devđể lưu gói đã cài đặt vào gói.

Làm cách nào để đạt được điều tương tự trong trình quản lý gói Python pip? Tôi muốn lưu tên gói và phiên bản của nó vào, requirements.pipngay sau khi cài đặt gói bằng cách sử dụng pip install package --save-dev requirements.pip.


4
pip freeze > requirements.pip
falsetru

5
Điều này không giống nhau. npm install package --save-devkết hợp cả cài đặt và bổ sung vào tệp yêu cầu node_npm cùng một lúc. Nó là tiện dụng hơn. Với pip freezetôi phải thực hiện hai lệnh để làm điều tương tự: 1) pip install package2)pip freeze > requirements.pip
hllau

1
Pip có vấn đề về --savetùy chọn.
Rutsky

Nếu sử dụng setup.py cho các yêu cầu, tôi đã tạo một mô-đun nhỏ để đóng băng các phiên bản gói của bạn vào setup.py.
AdamGold

Câu trả lời:


164

Không có tương đương với pip.

Cách tốt nhất là pip install package && pip freeze > requirements.txt

Bạn có thể thấy tất cả các tùy chọn có sẵn trên trang tài liệu của họ .

Nếu nó thực sự làm phiền bạn, sẽ không quá khó để viết một tập lệnh bash tùy chỉnh ( pips) tự động lấy một -sđối số và đóng băng vào requirements.txttệp của bạn .

Chỉnh sửa 1

Kể từ khi viết bài này, không có thay đổi nào trong việc cung cấp --save-devtùy chọn tự động tương tự NPM, tuy nhiên, Kenneth Reitz (tác giả requestsvà nhiều người khác) đã phát hành thêm một số thông tin về quy trình làm việc pip tốt hơn để xử lý pipcập nhật tốt hơn .

Chỉnh sửa 2

Được liên kết từ bài viết "quy trình công việc pip tốt hơn" ở trên, hiện được khuyến nghị sử dụng pipenvđể quản lý các yêu cầu và môi trường ảo. Gần đây đã sử dụng rất nhiều, tôi muốn tóm tắt quá trình chuyển đổi đơn giản như thế nào:

Cài đặt pipenv(trên máy Mac)

brew install pipenv

pipenvtạo và quản lý các môi trường ảo của riêng nó, vì vậy trong một dự án có sẵn requirements.txt, cài đặt tất cả các yêu cầu (tôi sử dụng Python3.7 nhưng bạn có thể loại bỏ --threenếu bạn không) đơn giản như sau:

pipenv --three install

Kích hoạt virtualenv để chạy các lệnh cũng dễ dàng

pipenv shell

Yêu cầu cài đặt sẽ tự động cập nhật PipfilePipfile.lock

pipenv install <package>

Cũng có thể cập nhật các gói lỗi thời

pipenv update

Tôi đặc biệt khuyên bạn nên kiểm tra nó đặc biệt là nếu đến từ một npmnền vì nó có cảm giác tương tự package.jsonpackage-lock.json


22
Lưu ý rằng điều này cũng sẽ lưu các phụ thuộc của các phụ thuộc mà theo thời gian có thể không cần thiết nữa vì sự phụ thuộc đã giảm việc sử dụng nó.
Patrick Bassut

Điều này dường như không giải quyết khía cạnh --save-dev của câu hỏi ban đầu cho phép bạn có các phụ thuộc khác nhau để phát triển cục bộ so với sản xuất. Làm thế nào bạn có thể đạt được điều đó với pipenv?
ngày

1
@jeznag pipenvcho phép bạn chỉ định một dev-packagestrong Pipfilevà / hoặc sử dụng --dev(hoặc -d) từ dòng lệnh. ví dụpipenv install --dev nose2
Ewan

39

Dòng đơn giản này là một điểm khởi đầu. Bạn có thể dễ dàng xây dựng lệnh bash để sử dụng lại GÓI trong dòng.

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

Cảm ơn @devsnd cho ví dụ về hàm bash đơn giản:

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

Để sử dụng nó, chỉ cần chạy:

pip-install-save some-package

Năm xu của tôiP=Flask pip install $P && pip freeze | grep $P >> requirements.txt
GBrian

4

Tôi đã tạo gói python bao quanh pipm thực tế pipđược gọi là . Tất cả các lệnh sẽ hoạt động như vậy, cộng với chúng sẽ được phản ánh trong tệp yêu cầu. không giốngpippip-save (công cụ tương tự tôi tìm thấy và không thể sử dụng), nó có thể xử lý nhiều tệp và môi trường (thử nghiệm, phát triển, sản xuất, v.v.). Nó cũng có lệnh để nâng cấp tất cả / bất kỳ phụ thuộc nào của bạn.

cài đặt

pipm install pkg-name

cài đặt như phụ thuộc phát triển

pipm install pkg-name --dev

cài đặt như phụ thuộc thử nghiệm

pipm install pkg-name --test

loại bỏ

pipm uninstall pkg-name

cập nhật tất cả các phụ thuộc của bạn

pipm update

cài đặt tất cả các phụ thuộc của bạn từ tệp yêu cầu

pipm install

bao gồm cả phụ thuộc phát triển

pipm install --dev


3

Cập nhật: rõ ràng, pipenv không được xác nhận chính thức bởi những người duy trì Pythontrang được liên kết trước đó thuộc sở hữu của một tổ chức khác. Công cụ này có những ưu và nhược điểm, nhưng giải pháp dưới đây vẫn đạt được kết quả mà OP đang tìm kiếm.

pipenv là một công cụ quản lý phụ thuộc kết thúc tốt đẹppip và, trong số những thứ khác, cung cấp những gì bạn đang hỏi:

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

$ pipenv install <package>

Điều này sẽ tạo ra một Pipfile nếu không tồn tại. Nếu có, nó sẽ tự động được chỉnh sửa với gói mới mà bạn cung cấp.

A Pipfilelà một tương đương trực tiếp package.json, trong khi Pipfile.locktương ứng với package-lock.json.



1

bạn có thể lưu thủ công nó trong Makefile (hoặc tệp văn bản và sau đó được nhập trong Makefile của bạn):


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

và sau đó chỉ cần chạy make install


Tôi hoàn toàn đồng ý với phương pháp này.
eleijonmarck

1

Tôi đang sử dụng dòng lệnh nhỏ này để cài đặt gói và lưu phiên bản của nó trong requirements.txt: pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt


0

Làm thế nào về việc thực hiện một chức năng shell để làm điều này? Thêm mã dưới đây vào ~/.profilehoặc~/.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
}

sau đó chạy source ~/.profilehoặc source ~/.bashrcnhập nó vào thiết bị đầu cuối hiện tại của bạn

khi bạn muốn cài đặt && lưu một gói, chỉ cần chạy, chẳng hạn pips requests. Sau khi gói được cài đặt, phiên bản của nó sẽ được lưu vào requirements.txtthư mục hiện tại của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.