Используя 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)
Если это встретит ваше одобрение, Ян, я рад написать патч.
извините за плохое форматирование .... 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.
Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Просто добавьте комментарий, если хотите, чтобы он оставался открытым. Спасибо за ваш вклад.