Virtualenv: --relocatable no apunta a activar el script a la ruta correcta

Creado en 14 mar. 2011  ·  14Comentarios  ·  Fuente: pypa/virtualenv

Usando Ubuntu 10.04, --relocatable funciona si invoco directamente el binario de Python o los scripts generados por setuptools. Sin embargo, bin / enable todavía refleja la ruta anterior:

> 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)>

Esto se debe a que VIRTUAL_ENV se establece en una ruta absoluta en el script. En cambio, esto debe hacerse relativo cuando se llama a --relocatable.

Dado que el script de activación debe ser obtenido, es un poco más complicado obtener la ruta que solo (por ejemplo) dirname $0 . Lo siguiente parece funcionar en 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)

Si esto cuenta con tu aprobación, Ian, me complace escribir un parche.


bug

Todos 14 comentarios

perdón por el formato deficiente ... bitbucket me engañó de nuevo :(


Original Comment By: Jeff Hammel

Y %~dp0% podría usarse en un entorno de Windows para obtener la ruta al
secuencia de comandos actual, es decir, para activar.bat.


Original Comment By: Sylvain Prat

Creo que es una buena idea, un parche sería genial.


Original Comment By: Jannis Leidel
  • Contenido modificado.

Original Comment By: Jannis Leidel

Aquí hay una versión mejor para bash:

VIRTUAL_ENV=$(cd $(dirname "$BASH_SOURCE"); dirname `pwd`)

Y para (t) csh:

set sourced=($_)

set scriptdir=`dirname "$sourced[2]"`

set scriptpwd=`cd "$scriptdir"; pwd`

setenv VIRTUAL_ENV `dirname "$scriptpwd"`

Original Comment By: Anonymous

Esto es lo que estoy usando:

VIRTUAL_ENV="$(dirname $(dirname $(readlink --canonicalize --no-newline

$ BASH_SOURCE))) "

o con las opciones cortas

VIRTUAL_ENV="$(dirname $(dirname $(readlink -f -n $BASH_SOURCE)))"

Original Comment By: Matteo Bertini

Y una opción para aquellos que todavía usan tcsh:

establecer origen = ($ _)
establecer scriptdir = dirname "$sourced[2]"
establecer scriptpwd = cd "$scriptdir"; pwd
setenv VIRTUAL_ENV dirname "$scriptpwd"

He realizado una solicitud de extracción para este cambio (que implementa solo el script bash):
https://github.com/pypa/virtualenv/pull/143

Para Windows, en ACTIVATE_BAT puede reemplazar:

set VIRTUAL_ENV=__VIRTUAL_ENV__

con:

pushd %~dp0..
set VIRTUAL_ENV=%CD%
popd

Esto es mejor que simplemente configurarlo en %~dp0.. directamente, ya que terminará con la misma ruta absoluta que tendría sin el cambio, pero es reubicable.

Agregar una referencia al problema más reciente # 1067 relacionado con esto para ayudar a consolidar los esfuerzos para resolver este problema de media década con los scripts de activación.

Esto es lo que estoy usando:

VIRTUAL_ENV="$(dirname $(dirname $(readlink --canonicalize --no-newline

$ BASH_SOURCE))) "

o con las opciones cortas

VIRTUAL_ENV="$(dirname $(dirname $(readlink -f -n $BASH_SOURCE)))"

El uso de readlink podría ser problemático, ya que tiene diferentes opciones de línea de comandos entre Linux, BSD / macOS y potencialmente otros tipos de Unix.

@ adah1972 , el número 1067 es el más reciente. Este número es de 2012, el número 1067 es de 2017.

@arizvisa Gracias. Yo también comenté en el # 1067.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Simplemente agregue un comentario si desea mantenerlo abierto. Gracias por sus aportaciones.

¿Fue útil esta página
0 / 5 - 0 calificaciones