Como você cria um script Bash para ativar um Python virtualenv?
Eu tenho uma estrutura de diretório como:
.env
bin
activate
...other virtualenv files...
src
shell.sh
...my code...
Posso ativar meu virtualenv por:
user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$
No entanto, fazer o mesmo a partir de um script Bash não faz nada:
user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$
O que estou fazendo de errado?
python
bash
virtualenv
Cerin
fonte
fonte
source
é mudar algo no shell atual. Você pode usar o python do virtualenv usando o caminho completo./env/bin/python
.Respostas:
Ao fazer o código, você está carregando o script de ativação em seu shell ativo.
Quando você faz isso em um script, você o carrega naquele shell que sai quando o script termina e você volta ao shell original não ativado.
Sua melhor opção seria fazê-lo em uma função
ou um pseudônimo
Espero que isto ajude.
fonte
Você deve chamar o script bash usando o código-fonte.
Aqui está um exemplo:
Em seu shell, basta chamá-lo assim:
Ou como @outmind sugeriu: (observe que isso não funciona com zsh)
Pronto, a indicação do shell será colocada em seu prompt.
fonte
source "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate"
produz:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found
which source
em um prompt do shell, massource venv3/bin/activate
faço o que espero e abro o venv. ...source ./env/bin/activate
(com o mesmo#!/bin/bash
prefixo) não? Qual é a diferença entre usar aspas e não usar?source ./env/bin/activate
porque isso é relativo ao caminho que você está executando certo? Se você alterar o diretório dentro do script, poderá ficar relativo.Embora não adicione o prefixo "(.env)" ao prompt do shell, descobri que esse script funciona conforme o esperado.
por exemplo
fonte
/bin/bash
para/usr/bin/env bash
deactivate
do subshell comexit
ou Ctrl + dSourcing executa comandos shell em seu shell atual. Quando você fornece dentro de um script como está fazendo acima, está afetando o ambiente para aquele script, mas quando o script é encerrado, as mudanças no ambiente são desfeitas, pois efetivamente saíram do escopo.
Se sua intenção é executar comandos shell no virtualenv, você pode fazer isso em seu script após obter o script de ativação. Se sua intenção é interagir com um shell dentro do virtualenv, você pode gerar um sub-shell dentro de seu script que herdaria o ambiente.
fonte
Aqui está o script que uso com frequência. Execute como
$ source script_name
fonte
Para que serve a fonte do script bash?
Se você pretende alternar entre vários virtualenvs ou entrar em um virtualenv rapidamente, já tentou
virtualenvwrapper
? Ele fornece muitos utilitários comoworkon venv
,mkvirtualenv venv
e assim por diante.Se você acabou de executar um script python em determinado virtualenv, use
/path/to/venv/bin/python script.py
para executá-lo.fonte
workon ...
de um script bash. (Porque quero executar mais coisas depois, toda vez que ele for inicializado). No entanto, não consigo encontrar uma maneira de fazê-lo funcionar.Você também pode fazer isso usando um subshell para melhor conter seu uso - aqui está um exemplo prático:
Este estilo é especialmente útil quando
commandA
oucommandC
existe em/opt/bin
commandB
existe no sistemaPATH
ou é muito comumfonte
$(...)
ou você perderá os espaços e tabulações contidos na saída."${VAR}"
é estritamente equivalente a"$VAR"
você não precisa de chaves em torno de variáveis de shell porque as aspas duplas são realmente mais poderosas. A exceção é ao usar modificadores como por exemplo"${VAR:-default_value}"
PATH=$PATH:/opt/bin
precisa de cotação adequada para lidar com caminhos com espaços e tabulações.edit
botão abaixo das postagens para sugerir mudanças nelas! Além disso, é importante saber que, embora seja frequentemente um requisito e importante para a segurança, qualquer pessoa que adicionarIFS
chars a intencionalmentePATH
é um terrorista.Você deve usar vários comandos em uma linha. por exemplo:
quando você ativa seu ambiente virtual em uma linha, acho que ele esquece as outras linhas de comando e você pode evitar isso usando vários comandos em uma linha. Funcionou para mim :)
fonte
Quando eu estava aprendendo venv, criei um script para me lembrar como ativá-lo.
Isso tem a vantagem de alterar o prompt.
fonte