Comment activer un virtualenv dans le script bash, entraînant une invite activée

Je veux un script qui configurera mes outils, mais maintiendra également l’environnement virtuel intact pour mon invite. Mais, comme le souligne heemayl ci-dessous, un script shell, lorsqu’il est exécuté, est exécuté dans un sous-shell et tous les parameters et l’environnement deviennent hors de scope une fois l’exécution terminée. Maintenant, je pense que le meilleur moyen serait d’ouvrir une nouvelle fenêtre de terminal à partir du script et de laisser le script “envoyer” une commande d’ source activate au nouveau terminal. Plus de détails suivent, mais existe-t-il un moyen de configurer mes outils et de me laisser dans une invite d’env virtuelle?

Lorsque je commençais à travailler sur plusieurs de mes projets, notamment ceux utilisant Django, je commençais de la même manière. Cela s’est transformé en script, ci-dessous.

 #!/bin/bash #0 cd into project cd $WSGI #1. Load the virtual env . /path/to/virtualenvs/django1-8-py-3/bin/activate #2. Open spyder or other IDEs spyder3 & #3. Run an interactive shell that runs the development server ie ipython -m pdb manage.py runserver 

Cela fonctionne bien, jusqu’à ce que je doive quitter l’ipython et entrer dans la bash activée. Comme le script ci-dessus est terminé après la fermeture de l’ipython, je suis tombé dans le shell normal. Mais ce que je veux, c’est voir l’invite ie (virtualenv) me @ mine: ~ $ comme si j’avais exécuté la commande source activate et non le script ci-dessus.

Cela sent comme un problème XY, je sais. Mais sans contexte, j’avais peur que ma question ne soit pas claire. Je demande comment faire un script qui, à la fin de celui-ci, me fournit un terminal avec mon virtualenv. Oui, je pourrais juste faire ceci:

 source acitvate run my script when done in ipython I'm still in virtual env 

Solution possible

Puis-je peut-être utiliser un script shell pour ouvrir une nouvelle fenêtre de terminal? A mon avis, existe-t-il un moyen de:

 do the steps in my script first then open a new terminal window run activate in this window 

… résultant en deux tabs / fenêtres, l’un qui exécute ipython et l’autre se trouve dans virtualenv bash (afin que je puisse, par exemple, exécuter les commandes manage.py sans arrêter ipython).

Un script shell, lorsqu’il est exécuté, s’exécute dans un sous-shell et tous les parameters et l’environnement sortent de leur scope une fois l’exécution terminée.

Pour rendre l’environnement disponible dans la session shell en cours, vous devez le source :

 source /path/to/script.sh 

Notez également que si vous souhaitez qu’un processus de blocage continue de fonctionner en arrière-plan pendant que vous récupérez l’access à l’invite du terminal, envoyez le processus en arrière-plan:

 some_command_to_run_in_background & 

Alors que je suis confronté au même cas, j’ai découvert que placer une source acitvate dans le source acitvate .bashrc d’un sous-shell pourrait être une bonne direction.

 #!/bin/bash # # This is an example for https://askubuntu.com/a/1052868/847382 # # Copyright 2018 (c) Sebastian Sawicki (0x52fb0d10) # OPENPGP4FPR:5691BED8E6CA579830842DD85CB361E552FB0D10 # # Licence: https://creativecommons.org/licenses/by/4.0/ # # Create temporary directory TMPDIR="$(mktemp --directory)" trap "echo 'INFO: Exited temporary shell.' >&2; rm --force --recursive '${TMPDIR}'" EXIT # Set-up virtualenv in the temporary directory virtualenv "${TMPDIR}" . "${TMPDIR}/bin/activate" # Install any required pip packages [ -r "$(pwd)/pyReqs.txt" ] && pip install --requirement "$(pwd)/pyReqs.txt" # Run a subshell with virtualenv already activated bash --rcfile "${TMPDIR}/bin/activate" -i