new article
This commit is contained in:
parent
6d45a204cb
commit
aeb4cfc2f2
40
content/posts/xonsh-pipenv-shell-hack.md
Normal file
40
content/posts/xonsh-pipenv-shell-hack.md
Normal file
@ -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...
|
Loading…
Reference in New Issue
Block a user