Các tương đương của Python với hộp carton của Ruby / Perl là gì?


93

Tôi biết về virtualenv và pip. Nhưng những thứ này hơi khác so với gói / thùng carton.

Ví dụ:

  • pip viết đường dẫn tuyệt đối đến shebang hoặc kích hoạt script
  • pip không có execlệnh phụ ( bundle exec bar)
  • virtualenv sao chép trình thông dịch Python vào một thư mục cục bộ

Có phải mọi nhà phát triển Python đều sử dụng virtualenv / pip không? Có các công cụ quản lý gói nào khác cho Python không?


4
Không, không phải mọi người dùng Python đều sử dụng virtualenv. Cá nhân tôi chưa bao giờ cần nó.
Fred Foo

Tôi không biết về một cái gì đó chính xác như Ruby Bundler (cái mà tôi không biết cho đến bây giờ, BTW). Những gì tôi thường làm là sử dụng cả virtualenv pip setuptools - hoặc distutils hoặc bất kỳ hệ thống phân phối nào mà tôi tìm thấy đầu tiên trên Google :) Tôi cũng tò mò về một câu trả lời nhưng đây là giải pháp của tôi hầu hết thời gian.
brandizzi

pipenvshovelđược đề cập dưới đây là những lựa chọn hiện đại hơn kể từ khi câu hỏi này được đặt ra.
Jim Meyer

Cả pipenv và xẻng đều không tương đương. Xẻng không giống như cái bó, giống cái cào hơn. Quản lý phụ thuộc Python còn khá xa. Nó sẽ được sáp nhập vào pip một ngày mặc dù ( pypi.org/project/pipfile ) ...
NOMAS Thủ

Câu trả lời:


72

Từ những gì tôi đã đọc về Bundler - pip không có virtualenv sẽ hoạt động tốt cho bạn. Bạn có thể coi nó như một cái gì đó giữa lệnh gem thông thường và gói lệnh. Những điều phổ biến bạn có thể làm với pip:

  1. Cài đặt gói (cài đặt đá quý)

    pip install mypackage
  2. Sự phụ thuộc và cài đặt hàng loạt (gemfile)

    Có lẽ cách dễ nhất là sử dụng các tệp tin request.txt của pip. Về cơ bản, nó chỉ là một danh sách đơn giản của các gói bắt buộc với các ràng buộc về phiên bản có thể có. Nó có thể trông giống như sau:

    nose==1.1.2
    django<1.3
    PIL
    

    Sau đó, khi bạn muốn cài đặt các phần phụ thuộc đó, bạn sẽ thực hiện:

    $ pip install -r requirements.txt

    Một cách đơn giản để xem tất cả các gói hiện tại của bạn theo cú pháp tệp yêu cầu là thực hiện:

    $ pip freeze

    Bạn có thể đọc thêm về nó ở đây .

  3. Thực thi (thực thi gói)

    Tất cả các gói python đi kèm với các tệp thực thi thường có sẵn trực tiếp sau khi cài đặt (trừ khi bạn có thiết lập tùy chỉnh hoặc đó là một gói đặc biệt). Ví dụ:

    $ pip install gunicorn
    $ gunicorn -h 
    
  4. Gói đá quý để cài đặt từ bộ nhớ cache (gói gói)

    pip bundlepip zip/unzip. Nhưng tôi không chắc có nhiều người sử dụng nó không.

ps Nếu bạn quan tâm đến cách ly môi trường, bạn cũng có thể sử dụng virtualenv cùng với pip (chúng là bạn thân và hoạt động hoàn hảo với nhau). Theo mặc định, pip cài đặt các gói trên toàn hệ thống có thể yêu cầu quyền quản trị viên.


46
Điều tuyệt vời về Bundler chính xác là phần virtualenv được tích hợp và trong hầu hết các trường hợp, không yêu cầu quyền quản trị viên. Trên thực tế, gói có thể là viên ngọc duy nhất mà người ta cần trên toàn cầu. bundle install --path vendorcài đặt mọi thứ cục bộ và bundle execđủ thông minh để tìm ra điều đó. Không cần thay đổi môi trường rõ ràng.
Debilski

11
Tôi không nghĩ điểm số 3 là đúng. Đơn giản chỉ cần chạy tệp thực thi ruby ​​có thể được thực hiện có hoặc không bundle exec. Toàn bộ điểm của bundle execnó là nó thay đổi môi trường như Gemfiletrước khi chạy tệp thực thi. Pip không có tương đương với bundle exec, mặc dù virtualenv có thể.
Sean Mackesey

@SeanMackesey bất cứ khi nào bạn chạy kích hoạt môi trường virtualenv, bạn ngay lập tức trở thành bên trong môi trường, ví dụ như python trỏ đến một trong env, không được cài đặt toàn cục, pythonpath đúng đối với env, tất cả các ứng dụng cũng chạy từ env đó.
chối Shabalin

8
Điều chính về Bundler là nó là một tiêu chuẩn defacto hiện nay, bạn có thể đảm bảo khá nhiều rằng BẤT KỲ dự án ruby ​​nào ở hầu hết mọi kích thước, sẽ có một Gemfilephần mềm gốc, và bạn có thể bundle installvà bạn có thể thực hiện được, hoặc bundle --deploymentvà nó ' Sẽ chỉ chạy trên một máy chủ mà không cần phải làm gì khác với điều kiện máy có phiên bản ruby ​​cần thiết trên đó. Python chỉ đơn giản là không có tương đương. Các công cụ ở đó, văn hóa thì không.
ocodo

14

Bạn có thể sử dụng pipenv , có giao diện tương tự với Bundler.

$ pip install pipenv

Pipenv tạo virtualenv tự động và cài đặt các phụ thuộc từ Pipfilehoặc Pipfile.lock.

$ pipenv --three           # Create virtualenv with Python3
$ pipenv install           # Install dependencies from Pipfile
$ pipenv install requests  # Install `requests` and update Pipfile
$ pipenv lock              # Generate `Pipfile.lock`
$ pipenv shell             # Run shell with virtualenv activated

Bạn có thể chạy lệnh với phạm vi virtualenv như bundle exec.

$ pipenv run python3 -c "print('hello!')"

3

Có một con chó săn nhân bản .

Phiên bản hiện đang ở dạng pip chỉ đọc requirements.txttệp bạn đã có, nhưng đã lỗi thời nhiều. Nó cũng không hoàn toàn tương đương: nó khăng khăng muốn tạo ra một virtualenv. Tôi nhận thấy rằng Bundler chỉ cài đặt những gói nào còn thiếu và cung cấp cho bạn tùy chọn cấp mật khẩu sudo để cài đặt vào hệ thống đào hoặc khởi động lại, điều này dường như không phải là một tính năng của pbundler.

Tuy nhiên, phiên bản trên git là một bản viết lại gần như hoàn chỉnh để gần với hoạt động của Bundler hơn nhiều ... bao gồm cả việc có "Cheesefile" và hiện không hỗ trợ tests.txt. Điều này là không may, vì tệp tests.txt là tiêu chuẩn thực tế trong pythonland và thậm chí còn có công việc được đóng dấu BDFL ngoại tuyến để tiêu chuẩn hoá nó . Khi điều đó có hiệu lực, bạn có thể chắc chắn rằng thứ gì đó như pbundler sẽ trở thành tiêu chuẩn trên thực tế. Than ôi, không có gì khá ổn định nhưng mà tôi biết (nhưng tôi sẽ yêu được chứng minh là sai).


Dự án này dường như đã biến mất. Hãy xem xét Thơ: stackoverflow.com/a/61771381/115075
bb.

1

Tôi đã viết một - https://github.com/Deepwalker/pundler . Trên PIP của nó pundle, tên đã được sử dụng.

Nó sử dụng requirements(_\w+)?.txtcác tệp làm phụ thuộc mong muốn của bạn và tạo frozen(_\w+)?.txtcác tệp có phiên bản cố định.

Về (_\w+)?điều - đây là envs. Bạn có thể tạo PUNDLEENV=testrequest_test.txt và sau đó sử dụng để sử dụng deps này trong quá trình chạy của bạn cùng với các khóa tests.txt bên cạnh.

Và về virtualenv - bạn không cần một cái nào cả, đó là những gì mà chuyên gia lấy từ gói trong đầu.


1

Tôi muốn nói rằng Shovel đáng để xem. Nó được phát triển đặc biệt cho phiên bản Pythonish của Rake. Không có quá nhiều hoạt động cam kết trong dự án, nhưng có vẻ ổn định và hữu ích.


1

Python Po là ứng dụng gần nhất với Ruby gói tính đến năm 2020 (và đã có từ năm 2018). Nó đã được hơn hai năm, vẫn còn rất tích cực, có tài liệu tuyệt vời. Người ta có thể phàn nàn về curl-pipe-python-style là cách cài đặt được khuyến nghị, nhưng có những lựa chọn thay thế, ví dụ như homebrew trên macOS.

Nó sử dụng virtualenvs đằng sau hậu trường (ngược lại với Bundler), nhưng nó cung cấp và sử dụng một tệp khóa, quản lý các phụ thuộc phụ, tuân thủ các ràng buộc phiên bản được chỉ định và cho phép tự động cập nhật các gói lỗi thời. Thậm chí còn có tính năng tự động hoàn thành cho trình bao yêu thích của bạn.

Với việc sử dụng tệp pyproject.toml, nó cũng tiến xa hơn một chút so với gói (gần giống với gemspec hơn. Nó cũng có thể so sánh với npm và sợi của JavaScript và TypeScript).

Porify (một dự án bổ sung) giúp chuyển đổi các dự án từ request.txt sang pyproject.toml cho Thơ.

Tệp khóa có thể được xuất sang tệp tests.txt poetry export -f requirements.txt > requirements.txt, nếu bạn cần tệp đó cho công cụ khác (hoặc trường hợp không chắc muốn quay lại).


0

Không, không phải tất cả các nhà phát triển đều sử dụng virtualenv và / hoặc pip, nhưng nhiều nhà phát triển sử dụng / thích các công cụ này

Và bây giờ, đối với các công cụ phát triển gói và môi trường khác nhau, đó là câu hỏi thực sự của bạn. Tồn tại bất kỳ công cụ nào khác như Buildout ( http://www.buildout.org/en/latest/ ) cho cùng mục đích, cô lập hệ thống xây dựng Python trong môi trường của bạn cho mọi dự án mà bạn quản lý. Trong một thời gian tôi sử dụng cái này, nhưng không phải bây giờ.

Môi trường độc lập cho mỗi dự án, trong Python hơi khác một chút so với tình huống tương tự trong Ruby. Trong trường hợp của tôi, tôi sử dụng pyenv ( https://github.com/yyuu/pyenv ) giống như rbenv nhưng, cho Python. các phiên bản khác nhau của python và virtualenvs cho mỗi dự án, và trong môi trường biệt lập này, tôi có thể sử dụng pip hoặc cài đặt dễ dàng (nếu cầ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.