Virtualenv: --relocatable 不会将激活脚本指向正确的路径

创建于 2011-03-14  ·  14评论  ·  资料来源: pypa/virtualenv

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

如果这得到您的认可,伊恩,我很高兴写一个补丁。


  • 比特桶: https :
  • 最初报道者:杰夫·哈默尔
  • 最初创建于:2010-05-05 19:48:03

所有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 的人提供一个选项:

设置来源=($_)
设置脚本目录= 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 中发表了评论。

此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 如果您想让它保持打开状态,只需添加评论。 感谢你的贡献。

此页面是否有帮助?
0 / 5 - 0 等级