使用 Ubuntu 10.04,如果我直接调用 python 二进制文件或 setuptools 生成的脚本,则 --relocatable 可以工作。 但是, 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 的人提供一个选项:
设置来源=($_)
设置脚本目录= dirname "$sourced[2]"
设置脚本密码= cd "$scriptdir"; pwd
setenv VIRTUAL_ENV dirname "$scriptpwd"
我为此更改提出了拉取请求(仅实现了 bash 脚本):
https://github.com/pypa/virtualenv/pull/143
对于 Windows,在 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 ,问题#1067 是最新的。 这个问题是 2012 年的,#1067 是 2017 年的。
@arizvisa谢谢。 我也在#1067 中发表了评论。
此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 如果您想让它保持打开状态,只需添加评论。 感谢你的贡献。