Virtualenv: --relocatable не указывает скрипту активации на правильный путь

Созданный на 14 мар. 2011  ·  14Комментарии  ·  Источник: pypa/virtualenv

Используя Ubuntu 10.04, --relocatable работает, если я напрямую вызываю двоичный файл python или сценарии, созданные setuptools. Однако bin / activate по-прежнему отражает старый путь:

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

Это потому, что VIRTUAL_ENV установлен на абсолютный путь в скрипте. Вместо этого это должно быть относительным при вызове --relocatable.

Поскольку сценарий активации должен быть получен, получить путь немного сложнее, чем просто (например) dirname $0 . Похоже, что в 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)

Если это встретит ваше одобрение, Ян, я рад написать патч.


Все 14 Комментарий

извините за плохое форматирование .... bitbucket снова обманул меня :(


Original Comment By: Jeff Hammel

И %~dp0% можно использовать в среде Windows, чтобы получить путь к
текущий скрипт, то есть для activate.bat.


Original Comment By: Sylvain Prat

Думаю, это хорошая идея, был бы отличный патч.


Original Comment By: Jannis Leidel
  • Изменен контент.

Original Comment By: Jannis Leidel

Вот лучшая версия для bash:

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

И для (t) csh:

set sourced=($_)

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

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

setenv VIRTUAL_ENV `dirname "$scriptpwd"`

Original Comment By: Anonymous

Вот что я использую:

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

$ BASH_SOURCE))) "

или с короткими опциями

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

Original Comment By: Matteo Bertini

И вариант для тех, кто все еще использует tcsh:

установить источник = ($ _)
установить scriptdir = dirname "$sourced[2]"
установить scriptpwd = cd "$scriptdir"; pwd
setenv VIRTUAL_ENV dirname "$scriptpwd"

Я сделал запрос на перенос этого изменения (который реализует только сценарий bash):
https://github.com/pypa/virtualenv/pull/143

Для окон в ACTIVATE_BAT можно заменить:

set VIRTUAL_ENV=__VIRTUAL_ENV__

с:

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

Это лучше, чем просто установить его на %~dp0.. напрямую, поскольку вы получите тот же абсолютный путь, что и без изменений, но его можно перемещать.

Добавление ссылки на новейшую проблему № 1067, связанную с этим, чтобы помочь объединить усилия по решению этой пятидесятилетней проблемы со сценариями активации.

Вот что я использую:

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

$ BASH_SOURCE))) "

или с короткими опциями

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

Использование readlink может быть проблематичным, поскольку у него разные параметры командной строки для Linux, BSD / macOS и, возможно, других разновидностей Unix.

@ adah1972 , выпуск

@arizvisa Спасибо. Я также прокомментировал в № 1067.

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Просто добавьте комментарий, если хотите, чтобы он оставался открытым. Спасибо за ваш вклад.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги