web-dev-qa-db-fra.com

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 paramètres et l'environnement deviennent hors de portée 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 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 virtuel?

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 i.e.

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 abandonné à la base de Shell. Mais ce que je veux, c’est que je reçoive l’invite i.e. (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 onglets/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).

4
Rick Page

Un script Shell, lorsqu'il est exécuté, s'exécute dans un sous-shell et tous les paramètres et l'environnement sont hors de portée une fois l'exécution terminée.

Pour rendre l'environnement disponible dans la session Shell actuelle, vous devez source it:

source /path/to/script.sh

En passant, si vous souhaitez que certains processus de blocage continuent de fonctionner en arrière-plan pendant que vous regagnez l'accès au message du terminal, envoyez le processus en arrière-plan:

some_command_to_run_in_background &
3
heemayl

Comme je suis confronté au même cas, j'ai découvert que l'insertion de source acitvate dans le .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
3
Sebo.PL

Ce n'est pas ce que vous avez demandé, mais je pense que cela pourrait vous aider.

Le moyen le plus simple d'activer l'environnement virtuel de n'importe où:

Note du développeur: - vous devez créer tous vos virtualenv dans un seul dossier, tel que virt.

En supposant que votre nom de dossier virtualenv est virt (si ce n'est pas le changer)

cd
mkdir custom

Pour installer nano, utilisez la commande ci-dessous ou utilisez votre éditeur favori

Sudo apt-get install nano

Pour quitter nano, appuyez sur ctrl+x et appuyez sur y

nano custom/vhelper

Ajoutez ces lignes ...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

Accordez l'autorisation d'exécuter à votre fichier

Sudo chmod +x custom/vhelper

exportez maintenant ce chemin de dossier personnalisé afin que vous puissiez le trouver en ligne de commande en cliquant sur l'onglet ...

PATH=$PATH:"$HOME/custom"

Maintenant, vous pouvez l'utiliser de n'importe où en tapant simplement la commande ci-dessous ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

supposons que ce soit abc alors ...

vhelper abc

Félicitations, vous avez activé votre virtualenv ...

0
SR_Mehta

Vous pouvez utiliser le venv sans l'activer.

Vous devez spécifier le chemin d'accès complet à l'interprète python dans le fichier venv, ainsi que le chemin d'accès complet au programme que vous souhaitez exécuter, qui figure également dans le fichier .vv.

À titre d'exemple, consultez ce script de sauvegarde qui exécute la commande Amazon aws cli, installée dans un venv, exécutée à partir d'un script Shell:

NOW=$(date +"%F-%H:%M:%S")
BACKUP_FILENAME="pg-dumpall-foo-$NOW.Zip"
SCHEMA_FILENAME="pg-schema-foo-$NOW.Zip"

cd ~
mkdir -p backup_tmp
cd backup_tmp
find . -type f -mmin +360 -delete
pg_dumpall -U postgres -h localhost | /bin/gzip -9 > $BACKUP_FILENAME
pg_dump -U postgres -h localhost -s foo  | /bin/gzip -9 > $SCHEMA_FILENAME
echo saving $BACKUP_FILENAME to s3
/opt/foo/venv3.6/bin/python /opt/foo/venv3.6/bin/aws s3 cp $BACKUP_FILENAME s3://foobackups/
echo saving $SCHEMA_FILENAME to s3
/opt/foo/venv3.6/bin/python /opt/foo/venv3.6/bin/aws s3 cp $SCHEMA_FILENAME s3://foobackups/
0
Duke Dougal