Apa persamaan Python dengan Ruby bundler / karton Perl?

93

Saya tahu tentang virtualenv dan pip. Tetapi ini sedikit berbeda dari bundler / karton.

Misalnya:

  • pip menulis jalur absolut ke shebang atau mengaktifkan skrip
  • pip tidak memiliki execsub perintah ( bundle exec bar)
  • virtualenv menyalin interpreter Python ke direktori lokal

Apakah setiap pengembang Python menggunakan virtualenv / pip? Apakah ada alat manajemen paket lain untuk Python?

riywo
sumber
4
Tidak, tidak semua pengguna Python menggunakan virtualenv. Saya pribadi tidak pernah membutuhkannya.
Fred Foo
Saya tidak mengetahui sesuatu yang persis seperti Ruby bundler (yang saya tidak tahu sampai sekarang, BTW). Apa yang biasa saya lakukan adalah menggunakan virtualenv dan pip dan setuptools - atau distutils atau sistem distribusi apa pun yang saya temukan pertama kali di Google :) Saya juga ingin tahu jawabannya, tetapi ini adalah solusi saya sebagian besar waktu.
brandizzi
pipenvdan shoveldisebutkan di bawah ini adalah pilihan yang lebih modern sejak pertanyaan ini diajukan.
Jim Meyer
Baik pipenv maupun sekop tidak setara. Sekop tidak seperti bundler, lebih seperti penggaruk. Manajemen ketergantungan Python cukup jauh di belakang. Ini akan digabung menjadi pip satu hari meskipun ( pypi.org/project/pipfile ) ...
NOMAS Perdana

Jawaban:

72

Dari apa yang saya baca tentang bundler - pip tanpa virtualenv seharusnya berfungsi dengan baik untuk Anda. Anda dapat menganggapnya sebagai sesuatu antara perintah gem biasa dan bundler. Hal umum yang dapat Anda lakukan dengan pip:

  1. Menginstal paket (gem install)

    pip install mypackage
  2. Dependensi dan pemasangan massal (gemfile)

    Mungkin cara termudah adalah dengan menggunakan file requirement.txt pip. Pada dasarnya ini hanya daftar paket yang diperlukan dengan kemungkinan batasan versi. Ini mungkin terlihat seperti:

    nose==1.1.2
    django<1.3
    PIL

    Nanti ketika Anda ingin menginstal dependensi tersebut, Anda akan melakukan:

    $ pip install -r requirements.txt

    Cara sederhana untuk melihat semua paket Anda saat ini dalam sintaks file persyaratan adalah dengan melakukan:

    $ pip freeze

    Anda dapat membaca lebih lanjut di sini .

  3. Eksekusi (eksekutif bundler)

    Semua paket python yang disertakan dengan file yang dapat dieksekusi biasanya langsung tersedia setelah instalasi (kecuali Anda memiliki pengaturan khusus atau itu adalah paket khusus). Sebagai contoh:

    $ pip install gunicorn
    $ gunicorn -h 
  4. Paket permata untuk dipasang dari cache (paket bundler)

    Ada pip bundledan pip zip/unzip. Tapi saya tidak yakin jika banyak orang yang menggunakannya.

ps Jika Anda peduli dengan isolasi lingkungan, Anda juga dapat menggunakan virtualenv bersama dengan pip (mereka adalah teman dekat dan bekerja sama dengan sempurna). Secara default pip menginstal paket di seluruh sistem yang mungkin memerlukan hak admin.

Denys Shabalin
sumber
46
Hal yang hebat tentang bundler adalah bagian virtualenv terintegrasi dan dalam kebanyakan kasus tidak diperlukan hak admin. Faktanya, bundel mungkin satu-satunya permata yang dibutuhkan secara global. bundle install --path vendormenginstal semuanya secara lokal dan bundle execcukup pintar untuk mengetahuinya. Tidak perlu perubahan lingkungan eksplisit.
Debilski
11
Saya rasa poin # 3 tidak benar. Cukup menjalankan ruby ​​yang dapat dieksekusi dapat dilakukan dengan atau tanpa bundle exec. Intinya bundle execadalah itu mengubah lingkungan seperti Gemfilesebelum menjalankan eksekusi. Pip tidak memiliki padanan dengan bundle exec, meskipun virtualenv mungkin.
Sean Mackesey
@SeanMackesey setiap kali Anda menjalankan pengaktifan lingkungan virtualenv, Anda akan segera berada di dalam lingkungan tersebut, misalnya python menunjuk ke yang ada di env, bukan yang terinstal secara global, pythonpath benar sehubungan dengan env, semua aplikasi juga berjalan dari env itu.
Denys Shabalin
8
Hal utama tentang bundler adalah ini adalah standar defacto sekarang, Anda dapat cukup menjamin bahwa proyek ruby ​​APAPUN dengan ukuran apa pun, akan memiliki tempat Gemfiledi akarnya, dan Anda bisa bundle installdan Anda siap melakukannya, atau bundle --deploymentdan itu ' Hanya akan berjalan di server dengan sedikit hal lain yang harus dilakukan asalkan mesin memiliki versi ruby ​​yang diperlukan di dalamnya. Python tidak memiliki padanan. Alatnya ada di sana, budaya di mana-mana tidak.
ocodo
15

Anda dapat menggunakan pipenv , yang memiliki antarmuka yang mirip dengan bundler.

$ pip install pipenv

Pipenv membuat virtualenv secara otomatis dan menginstal dependensi dari Pipfileatau 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

Anda dapat menjalankan perintah dengan lingkup virtualenv seperti bundle exec.

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

Ada pbundler tiruan .

Versi yang saat ini ada di pip hanya membaca requirements.txtfile yang sudah Anda miliki, tetapi sudah ketinggalan zaman. Ini juga tidak sepenuhnya setara: itu bersikeras membuatvirtualenv . Bundler, saya perhatikan, hanya menginstal paket apa yang hilang, dan memberi Anda opsi untuk memberikan kata sandi sudo Anda untuk menginstal ke direktori sistem Anda atau memulai ulang, yang tampaknya bukan fitur pbundler.

Namun, versi pada git adalah penulisan ulang yang hampir lengkap agar lebih mirip dengan perilaku Bundler ... termasuk memiliki "Cheesefile" dan sekarang tidak mendukung requirement.txt. Ini sangat disayangkan, karena requirement.txt adalah standar de facto di pythonland, dan bahkan ada pekerjaan yang dicap BDFL Resmi untuk menstandarkannya . Ketika hal itu mulai berlaku, Anda dapat yakin bahwa sesuatu seperti pbundler akan menjadi standar de facto. Sayangnya, belum ada yang cukup stabil yang saya tahu (tapi saya ingin sekali terbukti salah).

kousu
sumber
Proyek ini sepertinya telah lenyap. Pertimbangkan Puisi: stackoverflow.com/a/61771381/115075
bb.
1

Saya menulis satu - https://github.com/Deepwalker/pundler . Di PIP pundlenamanya sudah ada yang pakai.

Ini menggunakan requirements(_\w+)?.txtfile sebagai dependensi yang Anda inginkan dan membuat frozen(_\w+)?.txtfile dengan versi beku.

Tentang (_\w+)?hal - ini adalah envs. Anda dapat membuat persyaratan_test.txt dan kemudian menggunakan PUNDLEENV=testuntuk menggunakan deps ini dalam proses Anda dengan persyaratan.txt di sampingnya.

Dan tentang virtualenv - Anda tidak perlu satu, itu yang diambil pundle dari bundler di kepala pertama.

Mihail Krivushin
sumber
1

Python Poetry adalah yang paling dekat dengan bundler Ruby pada tahun 2020 (dan sudah sejak 2018). Umurnya sudah lebih dari dua tahun, masih sangat aktif, memiliki dokumentasi yang bagus. Orang mungkin mengeluh tentang curl-pipe-python-gaya adalah cara penginstalan yang disarankan, tetapi ada alternatif lain, misalnya homebrew di macOS.

Ia menggunakan virtualenv di belakang layar (berbeda dengan bundler), tetapi ia menyediakan dan menggunakan file-kunci, menangani sub-dependensi, mematuhi batasan versi yang ditentukan dan memungkinkan secara otomatis memperbarui paket yang sudah ketinggalan zaman. Bahkan ada pelengkapan otomatis untuk shell favorit Anda.

Dengan penggunaan file pyproject.toml, ini juga berjalan sedikit lebih jauh dari bundler (lebih dekat ke gemspec. Ini juga sebanding dengan JavaScript dan npm dan benang TypeScript).

Poetrify (proyek pelengkap) membantu mengubah proyek dari requirement.txt menjadi pyproject.toml untuk Puisi.

File kunci dapat diekspor ke requirement.txt oleh poetry export -f requirements.txt > requirements.txt, jika Anda membutuhkannya untuk perkakas lain (atau kasus yang tidak biasa ingin kembali).

bb.
sumber
1

Menurutku sekop layak untuk dilihat. Ini dikembangkan secara khusus untuk Rake versi Python. Tidak ada banyak aktivitas commit pada proyek ini, tetapi tampaknya stabil dan berguna.

Jim Meyer
sumber
0

Tidak, tidak semua pengembang menggunakan virtualenv dan / atau pip, tetapi banyak pengembang menggunakan / lebih suka alat ini

Dan sekarang, untuk alat pengembangan paket dan lingkungan yang berbeda itulah pertanyaan Anda yang sebenarnya. Gunakan alat lain seperti Buildout ( http://www.buildout.org/en/latest/ ) untuk tujuan yang sama, pisahkan sistem build Python lingkungan Anda untuk setiap proyek yang Anda kelola. Untuk beberapa waktu saya menggunakan ini, tetapi tidak sekarang.

Lingkungan independen per proyek, dengan Python sedikit berbeda dari situasi yang sama di Ruby. Dalam kasus saya, saya menggunakan pyenv ( https://github.com/yyuu/pyenv ) itu seperti rbenv tetapi, untuk Python. versi berbeda dari python dan virtualenvs per proyek, dan, dalam lingkungan yang terisolasi ini, saya dapat menggunakan pip atau instalasi mudah (jika diperlukan).

Yonsy Solis
sumber