Virtualenv: --relocatable não aponta o script de ativação para o caminho correto

Criado em 14 mar. 2011  ·  14Comentários  ·  Fonte: pypa/virtualenv

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.


bug

Todos 14 comentários

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
  • Conteúdo alterado.

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.

Esta página foi útil?
0 / 5 - 0 avaliações