From aeb4cfc2f278d480d456217a32b0303b22e404a0 Mon Sep 17 00:00:00 2001 From: Marvin Steadfast Date: Mon, 8 Jan 2018 08:57:11 +0000 Subject: [PATCH] new article --- content/posts/xonsh-pipenv-shell-hack.md | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 content/posts/xonsh-pipenv-shell-hack.md diff --git a/content/posts/xonsh-pipenv-shell-hack.md b/content/posts/xonsh-pipenv-shell-hack.md new file mode 100644 index 0000000..904275f --- /dev/null +++ b/content/posts/xonsh-pipenv-shell-hack.md @@ -0,0 +1,40 @@ +Title: xonsh: pipenv shell hack +Date: 2018-01-08 09:38 +Slug: xonsh-pipenv-shell-hack +Tags: xonsh, python, pipenv + +Ich benutze nun schon ein paar Monate [pipenv](http://pipenv.readthedocs.io/en/latest/). Dies macht das verwalten von Projekt-Virtualenvironments einfach. Das Programm handelt auch die Listen und Abhängigkeiten zu Library's die für das eigene Projekt gebraucht werden. Es erstellt automatisch ein Pipfile. Dies soll irgendwann mal auch für `pip` implementiert werden um die lästige `requirements.txt` abzulösen. + +So schön so gut. Meine Shells sind mal wieder in heavy rotation und so bin ich von `zsh` zu `fish` wieder bei [xonsh](http://xon.sh) gelandet. Mir liegt einfach Python. Das Problem mit `pipenv` ist nun das, dass Kommando `pipenv shell` nicht mehr funktioniert. Das aktivieren von `virtualenvs` scheint vor allem für die klassischen Shells konzipiert zu sein. `xonsh` benutzt seine eigene Verwaltung für die virtuellen Umgebungen: [vox](http://xon.sh/python_virtual_environments.html). Da alles andere zu funktionieren scheint, habe ich mir einfach einen Alias geschrieben, der auf der offiziellen `pipenv`-Funktion zum finden von virtuellen Umgebungen beruht. + + #!python + def _pipenv_shell(args, stdin=None): + import base64 + import hashlib + import os + import re + + if args[0] == 'shell': + print('WARNING: using own xonsh alias function instead of pipenv shell') + name = $PWD.split(os.sep)[-1] + sanitized = re.sub(r'[ $`!*@"\\\r\n\t]', '_', name)[0:42] + hash = hashlib.sha256(os.path.join($PWD, 'Pipfile').encode()).digest()[:6] + encoded_hash = base64.urlsafe_b64encode(hash).decode() + venv_name = sanitized + '-' + encoded_hash + for venv in $(ls $VIRTUALENV_HOME).splitlines(): + if venv == venv_name: + vox activate @(venv) + else: + ~/.local/bin/pipenv @(args) + +Das füge ich dann dem `alias`-Dictionary hinzu: + + :::python + aliases['pipenv'] = _pipenv_shell + +Damit `pipenv` und `vox` das selbe Verzeichnis für die `virtualenvs` benutzen setze ich + + :::python + $VIRTUALENV_HOME = os.path.join(os.path.expanduser('~'), '.local/share/virtualenvs') + +Ich hoffe das ich diese Krücke irgendwann nicht mehr brauche...