Usando o Ubuntu 10.04, --relocatable funciona se eu invocar diretamente o binário python ou os scripts gerados por setuptools. No entanto, bin / activate ainda reflete o caminho antigo:
> pwd
/home/jhammel
> virtualenv.py foo
New python executable in foo/bin/python
Installing setuptools............done.
> virtualenv.py --relocatable foo
Making script foo/bin/easy_install relative
Making script foo/bin/easy_install-2.6 relative
Making script foo/bin/pip relative
> mv foo bar
> cd bar
> . bin/activate
(foo)> echo $VIRTUAL_ENV
/home/jhammel/foo
(foo)> which python
/usr/bin/python
(foo)>
Isso ocorre porque VIRTUAL_ENV é definido como um caminho absoluto no script. Em vez disso, isso deve ser relativo quando --relocatable é chamado.
Como o script de ativação deve ser originado, é um pouco mais complicado obter o caminho do que apenas (por exemplo) dirname $0
. O seguinte parece funcionar no bash:
command=$(history 1) # this should go at the top of the file
parent_path() {
DIRECTORY=$(dirname ${!#})
cd $DIRECTORY/..
pwd
}
VIRTUAL_ENV=$(parent_path $command)
Se isso tiver sua aprovação, Ian, fico feliz em escrever um patch.
desculpe pela má formatação .... bitbucket me enganou novamente :(
Original Comment By: Jeff Hammel
E %~dp0%
pode ser usado em um ambiente Windows para obter o caminho para o
script atual, ou seja, para activate.bat.
Original Comment By: Sylvain Prat
Acho que é uma boa ideia, um patch seria ótimo.
Original Comment By: Jannis Leidel
Original Comment By: Jannis Leidel
Aqui está uma versão melhor para o bash:
VIRTUAL_ENV=$(cd $(dirname "$BASH_SOURCE"); dirname `pwd`)
E para (t) csh:
set sourced=($_)
set scriptdir=`dirname "$sourced[2]"`
set scriptpwd=`cd "$scriptdir"; pwd`
setenv VIRTUAL_ENV `dirname "$scriptpwd"`
Original Comment By: Anonymous
Isso é o que estou usando:
VIRTUAL_ENV="$(dirname $(dirname $(readlink --canonicalize --no-newline
$ BASH_SOURCE))) "
ou com as opções curtas
VIRTUAL_ENV="$(dirname $(dirname $(readlink -f -n $BASH_SOURCE)))"
Original Comment By: Matteo Bertini
E uma opção para quem ainda usa tcsh:
definir fonte = ($ _)
definir scriptdir = dirname "$sourced[2]"
definir scriptpwd = cd "$scriptdir"; pwd
setenv VIRTUAL_ENV dirname "$scriptpwd"
Fiz uma solicitação pull para essa mudança (que implementa apenas o script bash):
https://github.com/pypa/virtualenv/pull/143
Para Windows, em ACTIVATE_BAT você pode substituir:
set VIRTUAL_ENV=__VIRTUAL_ENV__
com:
pushd %~dp0..
set VIRTUAL_ENV=%CD%
popd
Isso é melhor do que apenas defini-lo como %~dp0..
diretamente, pois você acaba com o mesmo caminho absoluto que faria sem a alteração, mas é realocável.
Adicionando uma referência ao problema mais recente # 1067 relacionado a isso para ajudar a consolidar os esforços para resolver esse problema de meia década com os scripts de ativação.
Isso é o que estou usando:
VIRTUAL_ENV="$(dirname $(dirname $(readlink --canonicalize --no-newline
$ BASH_SOURCE))) "
ou com as opções curtas
VIRTUAL_ENV="$(dirname $(dirname $(readlink -f -n $BASH_SOURCE)))"
Usar readlink
pode ser problemático, pois tem diferentes opções de linha de comando entre Linux, BSD / macOS e potencialmente outros tipos de Unix.
@ adah1972 , a edição # 1067 é a mais recente. Esta edição é de 2012, # 1067 é de 2017.
Obrigado @arizvisa . Eu comentei em # 1067 também.
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Basta adicionar um comentário se quiser mantê-lo aberto. Obrigado por suas contribuições.