Virtualenv: --relocatable zeigt das Aktivierungsskript nicht auf den richtigen Pfad

Erstellt am 14. März 2011  ·  14Kommentare  ·  Quelle: pypa/virtualenv

Unter Ubuntu 10.04 funktioniert --relocatable, wenn ich die Python-Binärdatei oder die von Setuptools generierten Skripte direkt aufrufe. Bin/activate spiegelt jedoch immer noch den alten Pfad wider:

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

Dies liegt daran, dass VIRTUAL_ENV im Skript auf einen absoluten Pfad gesetzt ist. Stattdessen sollte dies relativiert werden, wenn --relocatable aufgerufen wird.

Da das Activate-Skript als Quelle angegeben werden muss, ist es etwas komplizierter, den Pfad zu ermitteln, als nur (zB) dirname $0 . Folgendes scheint in bash zu funktionieren:

command=$(history 1) # this should go at the top of the file
parent_path() {
DIRECTORY=$(dirname ${!#})
cd $DIRECTORY/..
pwd
}
VIRTUAL_ENV=$(parent_path $command)

Wenn das Ihre Zustimmung findet, Ian, freue ich mich, einen Patch zu schreiben.


bug

Alle 14 Kommentare

Entschuldigung für die schlechte Formatierung....bitbucket hat mich wieder ausgetrickst :(


Original Comment By: Jeff Hammel

Und %~dp0% könnte in einer Windows-Umgebung verwendet werden, um den Pfad zum
aktuelles Skript, also für activate.bat.


Original Comment By: Sylvain Prat

Ich finde es eine gute Idee, ein Patch wäre toll.


Original Comment By: Jannis Leidel
  • Geänderter Inhalt.

Original Comment By: Jannis Leidel

Hier ist eine bessere Version für bash:

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

Und für (t)csh:

set sourced=($_)

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

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

setenv VIRTUAL_ENV `dirname "$scriptpwd"`

Original Comment By: Anonymous

Das verwende ich:

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

$BASH_SOURCE)))"

oder mit den kurzen Optionen

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

Original Comment By: Matteo Bertini

Und eine Option für diejenigen, die noch tcsh verwenden:

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

Ich habe eine Pull-Anfrage für diese Änderung gestellt (die nur das Bash-Skript implementiert):
https://github.com/pypa/virtualenv/pull/143

Für Windows können Sie in ACTIVATE_BAT Folgendes ersetzen:

set VIRTUAL_ENV=__VIRTUAL_ENV__

mit:

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

Dies ist besser, als es direkt auf %~dp0.. zu setzen, da Sie am Ende den gleichen absoluten Pfad haben, den Sie ohne die Änderung hätten, aber er ist verschiebbar.

Hinzufügen eines Verweises auf die neueste Ausgabe Nr. 1067 zu diesem Thema, um die Bemühungen zur Lösung dieses halben Jahrzehnts alten Problems mit den Aktivierungsskripten zu konsolidieren.

Das verwende ich:

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

$BASH_SOURCE)))"

oder mit den kurzen Optionen

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

Die Verwendung von readlink könnte problematisch sein, da es verschiedene Befehlszeilenoptionen zwischen Linux, BSD/macOS und möglicherweise anderen Unix-Varianten gibt.

@adah1972 , Ausgabe #1067 ist die neueste. Diese Ausgabe ist von 2012, #1067 ist von 2017.

@arizvisa Danke. Ich habe auch in #1067 kommentiert.

Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivität hatte. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Fügen Sie einfach einen Kommentar hinzu, wenn Sie ihn offen halten möchten. Vielen Dank für Ihre Beiträge.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

npinto picture npinto  ·  4Kommentare

Tset-Noitamotua picture Tset-Noitamotua  ·  4Kommentare

erbatyr picture erbatyr  ·  5Kommentare

asottile picture asottile  ·  6Kommentare

abn picture abn  ·  4Kommentare