diff --git a/archetypes/post.md b/archetypes/post.md index 40260476..423732d7 100644 --- a/archetypes/post.md +++ b/archetypes/post.md @@ -24,6 +24,7 @@ series: - Indiweb, webmentions and friends - Horror stories - Data and Data Tools +- Python's Reptile Env reply: repost: like: diff --git a/config/_default/hugo.yaml b/config/_default/hugo.yaml index 9271afe3..87ca9bd6 100644 --- a/config/_default/hugo.yaml +++ b/config/_default/hugo.yaml @@ -8,6 +8,7 @@ ignoreLogs: - "warning-goldmark-raw-html" goToTop: true disableHugoGeneratorInject: true +enableGitInfo: true module: imports: diff --git a/content/post/2017/pipenv-e-come-tutto-e-in-uno/index.md b/content/post/2017/pipenv-e-come-tutto-e-in-uno/index.md index 0f092173..109e223a 100644 --- a/content/post/2017/pipenv-e-come-tutto-e-in-uno/index.md +++ b/content/post/2017/pipenv-e-come-tutto-e-in-uno/index.md @@ -1,74 +1,103 @@ --- -title: Pipenv e come tutto è in uno +title: Pipenv and all in one tool slug: pipenv-e-come-tutto-e-in-uno date: 2017-07-01 00:00:00 +0000 +lastmod: 2025-01-18T23:10:15+01:00 categories: - dev tags: - python - dev +- pipenv aliases: - "/dev/pipenv-e-come-tutto-e-in-uno/" -description: Assistiamo al matrimonio di Pipfile, Pip e PipEnv +description: Witnessing the marriage of Pipfile, Pip, and Pipenv. feature_link: "https://unsplash.com/photos/vYFcHzLYpmU" feature_text: "Photo by Max Letek on Unsplash" +series: +- Python's Reptile Env --- -Io sono un appassionato di podcast. Mi piace ascoltarli quando vado in giro e quando vado in palestra. E uno di questi è quello di [Kenneth Reitz](https://www.kennethreitz.org/), autore di svariati moduli python tra cui _Requests_ che tutti i pythonisti conoscono e usano. -L'ultimo progetto suo di mio interesse è PipEnv, _sacro matrimonio di pipfile, pip e virtualenv_. -Partiamo dalla base: per fare un progetto python solitamente si passano 3 fasi obligatorie +I am a big fan of podcasts. I enjoy listening to them while I'm commuting or at the gym. One of my favorites is by [Kenneth Reitz](https://www.kennethreitz.org/), the author of several Python modules, including *Requests*, which every Pythonista knows and uses. +His latest project that caught my interest is PipEnv, the *"sacred marriage of pipfile, pip, and virtualenv."* -* Si crea un _virtualenv_ su cui lavorare, in cui i pacchetti installati non vanno in conflitto con quelli nel sistema ottenendo così un ambiente pulito su cui lavorare -* Si fa una selezione dei moduli necessari per il progetto e li si installa nel _virtualenv_ attraverso _pip_ -* Si produce dal _virtualenv_ un file di _requirements.txt_ che indica cosa è installato +Let’s start with the basics: to create a Python project, you usually go through 3 mandatory phases: -Questo porta a dover tenere sempre aggiornato e pulito il _virtualenv_, sempre aggiornato il file _requirements.txt_ e fissare le versioni minime richieste (o addirittura la versione stessa) del modulo nel _requirements.txt_. +* You create a *virtualenv* to work in, so that installed packages don't conflict with those in the system, providing a clean environment. +* You select the modules needed for the project and install them in the *virtualenv* using *pip*. +* You generate a *requirements.txt* file from the *virtualenv* that indicates what is installed. -PipEnv di conseguenza fa tutto questo per te con pochi e semplici comandi. +This requires you to constantly keep the *virtualenv* updated and clean, keep the *requirements.txt* file synchronized, and pin the minimum versions (or the exact version) of the modules in the *requirements.txt*. -## Ad esempio? -Mettiamo caso che io debba creare uno script in python che mi recuperi dei feed rss e me li salvi in locale. +PipEnv does all of this for you with a few simple commands. -* Creo una cartella per il progetto, in modo da metterci tutto quello di cui ho bisogno +## For example? - mkdir progetto_python +Let’s say I need to create a Python script that fetches RSS feeds and saves them locally. -* Scelgo che versione di python usare, se quella corrente o quella _legacy_ +* I create a folder for the project to keep everything I need organized: - pipenv --three #versione corrente di python 3.x - # alternativamente - pipenv --two #legacy 2.7.x +``` bash + mkdir python_project +``` -* Inizio a scrivere codice e a installare pacchetti necessari per il progetto - pipenv install request - pipenv install flask +* I choose which Python version to use, whether the current one or the *legacy* version: +``` bash + pipenv --three # current Python 3.x version + # alternatively + pipenv --two # legacy 2.7.x -Questi comandi assieme a quello iniziale, mi permette di creare un _pipfile_ che descrive i moduli da me installati. La cosa più bella di questo _pipfile_ è che permette di avere più "ambienti" indicati nello stesso file. Questo significa che posso avere "testing", "travis", "dev" e "prod" tutti descritti in un unico file e gestiti in modo automatico. +``` -Quindi mi accordo che _flask_ non mi serve più perchè ho riscritto tutto in modo da non usarlo e rendere in codice più leggibile... Quindi cosa faccio? - pipenv uninstall flask +* I start writing code and installing the necessary packages for the project: -Questo comando elimina dal _pipfile_ flask rendendolo così "pulito" e sempre aggiornato. +``` bash + pipenv install requests + pipenv install flask -Una volta definito il _pipfile_ bisogna creare il _pipfile.lock_, ovvero una versione automatica, generata dall' "installazione corrente" in modo da riprodurre perfettamente l'ambiente. +``` - pipenv lock -Questo fissa i moduli installati con versione, hash e altri dati sia per i pacchetti indicati sia che con le loro dipendenze, in modo da ottenere tutte le indicazioni per riprodurre quel esatto ambiente. -# Tutto qui? -No, il sistema crea all'inizio un _virtualenv_ per il progetto e lo popola secondo le indicazioni passate dal terminale. -Questo ambiente virtuale è accessibile attraverso il comando +These commands, along with the initial setup, allow me to create a *Pipfile* that describes the modules I've installed. The best thing about this *Pipfile* is that it allows for multiple "environments" within the same file. This means I can have "testing", "travis", "dev", and "prod" all described in a single file and managed automatically. - pipenv shell +Now, suppose I realize I no longer need *flask* because I’ve rewritten everything to make the code more readable without it... What do I do? -che apre una shell nel _virtualenv_ del progetto e permette di eseguire comandi nella stessa _virtualenv_. +``` bash + pipenv uninstall flask -In oltre _PipEnv_ permette di convertire, se non presenti, i _requirements.txt_ in _pipfile_ e di aggiornare tutti i pacchetti attraverso +``` - pipenv update +This command removes flask from the *Pipfile*, keeping it "clean" and always up to date. -## Conclusione -Personalmente spero che questo sistema, o per lo meno _pipfile_, diventi lo standard per lo sviluppo di applicazioni python e soppianti i file _requirements.txt_ che trovo particolarmente poco pratici e troppo sintetici anche se fanno esattamente quello per cui sono stati pensati +Once the *Pipfile* is defined, you need to create the *Pipfile.lock*—an automatically generated version based on the "current installation" to perfectly reproduce the environment. + +``` bash + pipenv lock + +``` + +This pins the installed modules with their version, hash, and other data for both the specified packages and their dependencies, providing all the information needed to reproduce that exact environment. + +## Is that all? + +No, the system initially creates a *virtualenv* for the project and populates it according to the terminal commands. +This virtual environment is accessible via the command: + +``` bash + pipenv shell +``` + +This opens a shell within the project's *virtualenv* and allows you to execute commands inside that specific environment. + +Furthermore, *PipEnv* allows you to convert existing *requirements.txt* files into a *Pipfile* if they are not already present, and to update all packages using: + +``` bash + pipenv update +``` + +## Conclusion + +Personally, I hope this system—or at least the *Pipfile*—becomes the standard for Python application development and replaces *requirements.txt* files, which I find particularly impractical and too sparse, even if they do exactly what they were designed for. diff --git a/content/post/2024/why-do-i-disinstall-pipenv-and-use-only-poetry/index.md b/content/post/2024/why-do-i-disinstall-pipenv-and-use-only-poetry/index.md index 73bdb8ff..20238f1e 100644 --- a/content/post/2024/why-do-i-disinstall-pipenv-and-use-only-poetry/index.md +++ b/content/post/2024/why-do-i-disinstall-pipenv-and-use-only-poetry/index.md @@ -19,6 +19,8 @@ mp-syndicate-to: - https://brid.gy/publish/mastodon images: keywords: +series: +- Python's Reptile Env --- Some time ago I wrote about my preference to write Terminal Commands for what I need [^1] and thant was not the end of it. diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 4feed995..e26f062c 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -20,11 +20,24 @@ {{ . | time.Format $configDateFormat }} | {{ end -}} + {{ $published := .PublishDate | time.Format ":date_medium" }} + {{ $modified := .Lastmod | time.Format ":date_medium" }} + {{ if ne $published $modified }} + {{- with .Lastmod }} + {{ $ISO_time := dateFormat "2006-01-02T15:04:05-07:00" . }} + + | + {{ end -}} + {{ end -}} Reading time {{.ReadingTime}} minutes | Word count {{.WordCount}} {{ end }} {{- partial "tags.html" . -}} + {{ partial "series.html" . }} +
@@ -47,7 +60,7 @@ {{- partial "bridgy.html" . -}} {{ .Content }} - + {{ partial "series.html" . }} {{ partial "share-buttons" . }} {{ partial "cite" . }} {{- partial "syndication.html" . -}}