Quali sono gli equivalenti Python al bundler di Ruby / al cartone di Perl?


93

Conosco virtualenv e pip. Ma questi sono un po 'diversi da bundler / carton.

Per esempio:

  • pip scrive il percorso assoluto di shebang o attiva lo script
  • pip non ha il execcomando secondario ( bundle exec bar)
  • virtualenv copia l'interprete Python in una directory locale

Ogni sviluppatore Python usa virtualenv / pip? Esistono altri strumenti di gestione dei pacchetti per Python?


4
No, non tutti gli utenti Python usano virtualenv. Personalmente non ne ho mai avuto bisogno.
Fred Foo

Non sono a conoscenza di qualcosa esattamente come il bundler Ruby (che non sapevo fino ad ora, BTW). Quello che faccio è usare sia virtualenv che pip e setuptools - o distutils o qualunque sistema di distribuzione che trovo per primo in Google :) Anch'io sono curioso di una risposta, ma questa è la mia soluzione la maggior parte del tempo.
brandizzi

pipenve shovelmenzionate di seguito sono scelte più moderne da quando è stata posta questa domanda.
Jim Meyer

Né pipenv né shovel sono equivalenti. Shovel non è per niente come un bundler, più come un rastrello. La gestione delle dipendenze di Python è piuttosto indietro. Un giorno però sarà unito a pip ( pypi.org/project/pipfile ) ...
Nomas Prime,

Risposte:


72

Da quello che ho letto su bundler - pip senza virtualenv dovrebbe funzionare bene per te. Puoi pensarlo come qualcosa tra il normale comando gem e il bundler. Cose comuni che puoi fare con pip:

  1. Installazione di pacchetti (gem install)

    pip install mypackage
  2. Dipendenze e installazione in blocco (gemfile)

    Probabilmente il modo più semplice è usare i file requirements.txt di pip. Fondamentalmente è solo un semplice elenco di pacchetti richiesti con possibili vincoli di versione. Potrebbe assomigliare a:

    nose==1.1.2
    django<1.3
    PIL

    Più tardi, quando vorresti installare quelle dipendenze, faresti:

    $ pip install -r requirements.txt

    Un modo semplice per vedere tutti i tuoi pacchetti correnti nella sintassi dei file dei requisiti è fare:

    $ pip freeze

    Puoi leggere di più al riguardo qui .

  3. Esecuzione (bundler exec)

    Tutti i pacchetti python forniti con file eseguibili sono generalmente disponibili direttamente dopo l'installazione (a meno che non si disponga di un'installazione personalizzata o di un pacchetto speciale). Per esempio:

    $ pip install gunicorn
    $ gunicorn -h 
  4. Gemme del pacchetto per l'installazione dalla cache (pacchetto bundler)

    C'è pip bundlee pip zip/unzip. Ma non sono sicuro che molte persone lo usino.

ps Se ti interessa l'isolamento dell'ambiente puoi anche usare virtualenv insieme a pip (sono amici stretti e lavorano perfettamente insieme). Per impostazione predefinita, pip installa pacchetti a livello di sistema che potrebbero richiedere diritti di amministratore.


46
La cosa grandiosa del bundler è esattamente che la parte virtualenv è integrata e nella maggior parte dei casi non sono richiesti diritti di amministratore. In effetti, il bundle potrebbe essere l'unica gemma di cui hai bisogno a livello globale. bundle install --path vendorinstalla tutto localmente ed bundle execè abbastanza intelligente da capirlo. Non sono necessarie modifiche esplicite all'ambiente.
Debilski

11
Non penso che il punto 3 sia corretto. È possibile eseguire semplicemente un eseguibile ruby ​​con o senza bundle exec. Il punto bundle execè che altera l'ambiente come da Gemfileprima di eseguire l'eseguibile. Pip non ha equivalenti a bundle exec, sebbene virtualenv potrebbe.
Sean Mackesey

@SeanMackesey ogni volta che esegui l'attivazione dell'ambiente virtualenv diventi immediatamente all'interno dell'ambiente, ad es. Python punta a quello nell'env, non installato globalmente, pythonpath è corretto rispetto a env, tutte le app vengono eseguite anche da quell'env.
Denys Shabalin

8
La cosa principale del bundler è che ora è uno standard di fatto, puoi praticamente garantire che QUALSIASI progetto ruby ​​di qualsiasi dimensione, avrà un Gemfileposto nella sua radice, e puoi bundle installe sei a posto, o bundle --deploymente ' girerò su un server con poco altro da fare, a patto che la macchina abbia la versione richiesta di ruby ​​su di essa. Python semplicemente non ha un equivalente. Gli strumenti ci sono, l'ubiquità culturale no.
ocodo

14

Puoi usare pipenv , che ha un'interfaccia simile a bundler.

$ pip install pipenv

Pipenv crea virtualenv automaticamente e installa le dipendenze da Pipfileo 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

Puoi eseguire comandi con ambito virtualenv come bundle exec.

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

3

C'è un clone pbundler .

La versione attualmente in pip legge semplicemente il requirements.txtfile che hai già, ma è decisamente obsoleta. Inoltre non è del tutto equivalente: insiste nel creare un file virtualenv. Bundler, ho notato, installa solo i pacchetti mancanti e ti dà la possibilità di fornire la tua password sudo per l'installazione nelle directory di sistema o di riavviare, che non sembra essere una caratteristica di pbundler.

Tuttavia, la versione su git è una riscrittura quasi completa per essere molto più vicina al comportamento di Bundler ... incluso avere un "Cheesefile" e ora non supporta requirements.txt. Questo è un peccato, dal momento che requirements.txt è lo standard de facto in pythonland, e c'è persino un lavoro con il marchio BDFL ufficiale per standardizzarlo . Quando ciò entrerà in vigore, puoi essere certo che qualcosa come pbundler diventerà lo standard de facto. Ahimè, niente ancora del tutto stabile che io sappia (ma mi sarebbe piacerebbe essere smentiti).


Questo progetto sembra essere svanito. Considera la poesia: stackoverflow.com/a/61771381/115075
bb.

1

Ne ho scritto uno: https://github.com/Deepwalker/pundler . Su PIP il suo pundlenome era già stato preso.

Utilizza i requirements(_\w+)?.txtfile come dipendenze desiderate e crea frozen(_\w+)?.txtfile con versioni congelate.

A proposito di (_\w+)?cosa - questo è envs. Puoi creare requirements_test.txt e quindi utilizzare PUNDLEENV=testper utilizzare questo deps nella tua corsa con i requirements.txt accanto.

E a proposito di virtualenv: non ne hai bisogno, è quello che il pundle prende dal bundler in prima testa.


1

Direi che vale la pena dare un'occhiata a Shovel . È stato sviluppato specificamente per la versione Python di Rake. Non c'è un sacco di attività di commit sul progetto, ma sembra stabile e utile.


1

Python Poetry è il bundler più vicino al Ruby nel 2020 (e già dal 2018). Ha già più di due anni, è ancora molto attivo, ha un'ottima documentazione. Ci si potrebbe lamentare del fatto che lo curl-pipe-pythonstile sia il modo di installazione consigliato, ma ci sono alternative, ad esempio homebrew su macOS.

Utilizza virtualenvs dietro le quinte (a differenza del bundler), ma fornisce e utilizza un file di blocco, si prende cura delle dipendenze secondarie, aderisce ai vincoli di versione specificati e consente l'aggiornamento automatico dei pacchetti obsoleti. C'è anche il completamento automatico per la tua shell preferita.

Con il suo utilizzo di un file pyproject.toml, va anche un po 'oltre il bundler (più vicino a un gemspec. È anche paragonabile a npm e filato di JavaScript e TypeScript).

Poetrify (un progetto complementare) aiuta a convertire i progetti da requirements.txt a pyproject.toml per Poetry.

Il file di blocco può essere esportato in requirements.txt da poetry export -f requirements.txt > requirements.txt, se è necessario per altri strumenti (o nel caso improbabile si desidera tornare indietro).


0

No, no tutti gli sviluppatori usano virtualenv e / o pip, ma molti sviluppatori usano / preferiscono questi strumenti

E ora, per gli strumenti di sviluppo dei pacchetti e gli ambienti diversi, questa è la tua vera domanda. Esiste qualsiasi altro strumento come Buildout ( http://www.buildout.org/en/latest/ ) per lo stesso scopo, isola il tuo ambiente sistema di compilazione Python per ogni progetto che gestisci. Da tempo lo uso, ma non ora.

Gli ambienti indipendenti per progetto, in Python, sono leggermente diversi dalla stessa situazione in Ruby. Nel mio caso uso pyenv ( https://github.com/yyuu/pyenv ) che è qualcosa come rbenv ma, per Python. diverse versioni di python e virtualenvs per progetto e, in questi ambienti isolati, posso usare pip o easy-install (se necessario).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.