4 votes

exécuter virtualenv dans un nouvel onglet du terminal automatiquement

J'utilise virtualenv, donc pour commencer je dois dire

source some/long/path/bin/activate

Parfois (très souvent, en fait), je veux créer un autre onglet dans le terminal, pour éditer un autre script, ou pour exécuter le script de django, etc. Et après la création d'un autre onglet, je dois dire que source some/long/path/bin/activate encore. En fait, c'est assez ennuyeux.

Existe-t-il un moyen de forcer le terminal à exécuter automatiquement ces mots magiques ? Donc si je tape CtrlShiftT dans le terminal, et que dans l'onglet actuel virtualenv est lancé, le terminal devrait ouvrir le même virtualenv dans le nouvel onglet.

Ou peut-être quelque chose de complètement différent pour résoudre ce problème.

3voto

ccpizza Points 1294

Cibler des émulateurs de terminal spécifiques

L'exécution automatique d'une commande lors de la création d'un nouvel onglet de terminal est une fonctionnalité du terminal spécifique que vous utilisez, et n'est pas liée à l'utilisation de la fonction python o virtualenv .

Pour obtenir un éventail plus large de réponses, il faudrait probablement poser la question suivante Comment lancer automatiquement une commande Shell pour l'émulateur de terminal xyz . Par exemple, pour gnome-terminal vous pouvez utiliser des profils personnalisés comme décrit dans https://unix.stackexchange.com/a/3856/15312 mais cette solution n'est pas transférable si vous décidez de passer à un autre terminal ou à une autre plate-forme.

D'un autre côté, personne ne veut être enfermé dans une application de terminal spécifique. L'option suivante serait donc une approche plus portable.

Ciblage de Shell init Shell

Si vous contrôlez le Shell qui est exécuté dans l'onglet, alors vous pouvez le faire dans votre Shell init Shell.

Par exemple, pour bash vous pouvez ajouter les lignes suivantes dans votre ~/.bashrc script :

if [[ -f .venv/bin/activate ]] ; then
    source .venv/bin/activate
fi 

Pour zsh ajouter l'extrait à ~/.zshrc .

Chaque fois que vous créez un nouveau Shell ou que vous ouvrez un nouvel onglet, ce snippet vérifiera si vous avez un .venv dans le chemin actuel et activer cette venv automatiquement. Si vous créez vos virtualenvs dans un dossier qui n'est pas nommé .venv puis ajuster le script en conséquence.

Vous pourriez également vouloir remplacer cd de sorte que chaque fois que vous cd dans un venv, il sera automatiquement activé :

Vous trouverez ci-dessous un exemple pour zsh :

function cd() {
  builtin cd $1

  if [[ -f .venv/bin/activate ]] ; then
    source .venv/bin/activate
  fi
}

Réduire la saisie avec virtualenvwrapper

En ce qui concerne plus particulièrement virtualenv : vous pouvez essayer virtualenvwrapper qui peut aider à réduire le nombre de frappes et à faciliter la gestion des environnements en fournissant une autocomplétion pour les dossiers virtualenv.

Processus d'antécédents

Enfin, comme solution de contournement rapide, au lieu de créer de nouveaux onglets avec le même env, vous pouvez suspendre un processus en cours d'exécution (tel que manage.py runserver ) avec Ctr + z et, éventuellement, exécuter bg pour le reprendre en arrière-plan si vous souhaitez qu'il continue à fonctionner, puis modifiez et enregistrez un fichier, et ramenez le processus original au premier plan avec fg . Ver este pour plus de détails.

1voto

Ignatius Points 111

J'utilise Conda pour les environnements virtuels, et j'ai ressenti le même besoin que votre question. J'ai donc écrit un simple Shell Shell pour moi-même. Puis je suis tombé sur cette question, et j'ai réécrit mon Shell pour l'utilisation de virtualenv.

  1. Sauvegarder le code suivant comme un script
  2. Donnez-lui le nom que vous voulez. Disons que tab .
  3. Donnez la permission de l'exécuter : sudo chmod +x tab .
  4. mv tab /usr/local/bin/ pour en faire une commande appelable de partout.
  5. Le script dépend de trois autres outils, xclip, xdotool, et wmctrl. Si vous ne les avez pas, sudo apt install xclip xdotool, wmctrl
  6. Yay ! J'étais trop paresseux pour Control + Shift + T et exécuter source /.../bin/activate mais je peux maintenant faire tab ¡!

    !/bin/sh

    Copy the clipboard content to restore later

    original_clipboard=$(xclip -o)

    Copy the path of your virtual environment to clipboard

    echo $VIRTUAL_ENV | xclip

    The following four lines open a new tab and switch to it.

    Copied from: https://stackoverflow.com/a/2191093/10953328

    WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}') xdotool windowfocus $WID xdotool key ctrl+shift+t wmctrl -i -a $WID

    Activate your virtualenv

    xdotool type --delay 0.5 --clearmodifiers "source $(xclip -o)/bin/activate" xdotool key Return;

    Restore the original clipboard content

    echo $original_clipboard | xclip

Testé avec Ubuntu 18.0.4, GNOME 3.28.2, et cela fonctionne bien. xdotools 3.20160805.1, xclip 0.12, wmctrl 1.07, mais je ne pense pas que cela ait beaucoup d'importance, n'est-ce pas ?

Une partie du script est copié de cette réponse SO comme mentionné dans le script lui-même.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X