Como ativar um virtualenv dentro do script bash resultando em um prompt ativado

4

Eu quero um script que configure minhas ferramentas, mas também mantenha o ambiente virtual intacto para o meu prompt. Mas, como heemayl aponta abaixo, um script de shell, quando executado, é executado em um subshell e todos os parâmetros e ambiente saem do escopo assim que a execução é concluída. Agora estou pensando, a melhor maneira seria abrir uma nova janela de terminal a partir do script e fazer com que o script "enviasse" um comando source activate para o novo terminal. Mais detalhes seguem, mas existe uma maneira de configurar minhas ferramentas e me deixar em um prompt de env virtual?

Quando comecei a trabalhar em muitos dos meus projetos, ou seja, aqueles que usam o Django, eu começaria da mesma maneira. Isso se transformou em um script, abaixo.

#!/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

Isso funciona bem, até que eu precise sair do ipython e entrar na festa ativada. Como o script acima foi concluído depois que o ipython é encerrado, sou colocado no shell simples. Mas o que eu quero é ver o prompt, ou seja     (virtualenv) me @ mine: ~ $ como se eu tivesse executado o comando source activate e não o script acima.

Isso cheira a um problema XY, eu sei. Mas sem contexto, receei que minha pergunta não fosse clara. Estou perguntando como fazer um script que, no final, me fornece um terminal com o meu virtualenv. Sim, eu poderia simplesmente fazer isso:

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

Solução possível

Posso usar um script de shell para abrir uma nova janela de terminal? Eu estou pensando, talvez haja uma maneira de:

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

... resultando em duas guias / janelas, uma que executa o ipython e a outra está no virtualenv bash (para que eu possa, por exemplo, executar comandos manage.py sem parar o ipython).

    
por RP Codes 18.08.2016 / 20:54

2 respostas

3

Um script de shell, quando executado, é executado em um subshell e todos os parâmetros e ambiente saem do escopo assim que a execução é concluída.

Para disponibilizar o ambiente na sessão de shell atual, você precisa source it:

source /path/to/script.sh

Como observação, se você quiser que algum processo de bloqueio continue funcionando em segundo plano enquanto recupera o acesso ao terminal, envie o processo para o plano de fundo:

some_command_to_run_in_background &
    
por heemayl 18.08.2016 / 21:01
2

Como estou enfrentando o mesmo caso, descobri que colocar source acitvate no .bashrc de um subshell pode ser uma boa direção.

#!/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
    
por Sebo.PL 07.07.2018 / 04:33