Eu criei uma pasta e inicializei uma instância virtualenv nela.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Quando executo (env)$ pip freeze
, ele mostra os pacotes instalados como deveria.
Agora eu quero mudar o nome myproject/
para project/
.
$ mv myproject/ project/
No entanto, agora quando corro
$ . env/bin/activate
(env)$ pip freeze
diz pip não está instalado. Como renomear a pasta do projeto sem interromper o ambiente?
python
ubuntu
virtualenv
pip
Riley Watkins
fonte
fonte
Respostas:
Você precisa ajustar sua instalação para usar caminhos relativos.
virtualenv
prevê isso com a--relocatable
opção Dos documentos :fonte
grep -EIr '\Wold_venv_name\W' /path/to/new_venv
ajudará a encontrar quaisquer shabangs que usem o venv antigo, mas não é uma verificação completa do venv realocado..project
arquivo virtualenvwrapper , que contém o caminho para o código-fonte que depende do virtualenv, supondo que você esteja usando virutalenvwrapper e também renomeou o diretório do projeto para corresponder ao novo virtualenv.Eu acredito que "saber o porquê" importa mais do que "saber como" . Então, aqui está outra abordagem para corrigir isso.
Quando você executa
. env/bin/activate
, ele realmente executa os seguintes comandos (usando,/tmp
por exemplo):No entanto, você acabou de renomear
myproject
paraproject
, para que o comando não seja executado. É por isso que dizpip is not installed
: porque você não instaloupip
no ambiente global do sistema e seu virtualenvpip
não foi originado corretamente.Se você deseja corrigir isso manualmente, é assim:
Com seu editor favorito como o Vim, modifique
/tmp/project/env/bin/activate
normalmente na linha 42:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
Modifique
/tmp/project/env/bin/pip
na linha 1:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
Depois disso, ative seu ambiente virtual
env
novamente e você verá quepip
voltou.fonte
grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name
. De fato, notei que em uma das minhas instâncias do Django, muitos pacotes tinham o "caminho para o Python sh-bang" neles.virtualenv
. Talvez haja algum caso de uso que eu não estou usando e, portanto, não encontre o problema.virtualenv
. Para resolvê-lo, editei o cabeçalho do bash (como é chamado?) Noipython
arquivo e funcionou bem.NOTA: Como @jb. salienta que esta solução se aplica apenas a s (re) criados facilmente
virtualenv
. Se um ambiente demorar várias horas para instalar esta solução, não é recomendadoOs virtualvs são ótimos porque são fáceis de criar e alternar; eles evitam que você fique bloqueado em uma única configuração. Se você conhece os requisitos do projeto ou pode obtê-los, faça um novo
virtualenv
:Crie um
requirements.txt
arquivo(env)$ pip freeze > requirements.txt
requirements.txt
arquivo, verifiqueenv/lib/pythonX.X/site-packages
antes de remover o originalenv
.Excluir o existente
(env)
deactivate && rm -rf env
Crie um novo
virtualenv
, ative-o e instale requisitosvirtualenv env && . env/bin/activate && pip install -r requirements.txt
Como alternativa, use virtualenvwrapper para facilitar um pouco as coisas, pois todos os virtualenvs são mantidos em um local centralizado
fonte
pip install -r requirements.txt
leva algumas horas (compilando extensões C de terceiros no raspberry pi).virtualenv env && pip install -r requirements.txt
não instalará os requisitos no novo ambiente, porque você não ativá-lovirtualenv-wrapper
usuário (que é ativado automaticamente na criação). Atualizei minha resposta para incluir a ativação dovirtualenv
na esperança de evitar qualquer confusão.Eu sempre instalo o virtualenvwrapper para ajudar. No prompt do shell:
Existe uma maneira documentada nos documentos virtualenvwrapper - cpvirtualenv É isso que você faz. Verifique se você está fora do seu ambiente e volte ao prompt do shell. Digite aqui com os nomes necessários:
E então, se necessário:
Para ir para o seu newenv:
fonte
virtualenvwrapper
, não apenasvirtualenv
. Esta resposta de @ryankdwyer é melhor.Você pode corrigir seu problema seguindo estas etapas:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
para verificar se seus pacotes estão no lugarfonte
--relocatable
, acho que essa solução é melhor que a resposta aceita. Até agora, notei que muitos.pyc
arquivos_new_name_/lib/python2.7
ainda se referem_old_name_
. No entanto, isso não parece afetar o funcionamento do meu ambiente. Talvez a única solução melhor esteja usandovirtualenvwrapper
ou alguns dos outros utilitários mencionados entre as respostas aqui. Pelo menos esta solução não requer a instalação de programas adicionais.Outra maneira de fazer isso que funcionou para mim muitas vezes sem problemas é o virtualenv-clone :
fonte
(dentro da pasta do projeto)
Não se esqueça de desativar e ativar
fonte
sed -i "s|$old_dir|$new_dir|g" bin/*
sed -i '.original' 's/old_dir_name/new_dir_name/g' *
para macsvirtualenv --relocatable ENV
não é uma solução desejável. Suponho que a maioria das pessoas deseja renomear um virtualenv sem nenhum efeito colateral a longo prazo.Então, eu criei uma ferramenta simples para fazer exatamente isso. A página do projeto para virtualenv-mv descreve-a um pouco mais detalhadamente, mas essencialmente você pode usá-
virtualenv-mv
lo como faria com uma implementação simples demv
(sem nenhuma opção).Por exemplo:
Observe, no entanto, que acabei de hackear isso. Isso pode ocorrer em circunstâncias incomuns (por exemplo, virtualenvs com links simbólicos), portanto, tenha cuidado (faça backup do que você não pode perder) e informe-me se encontrar algum problema.
fonte