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)

これがあなたの承認に合うなら、イアン、私はパッチを書いてうれしいです。


  • Bitbucket: https
  • 当初の報告者:Jeff Hammel
  • 当初の作成日:2010-05-05 19:48:03
bug

全てのコメント14件

フォーマットが悪いのでごめんなさい.... bitbucketはまた私をだましました:(


Original Comment By: Jeff Hammel

また、Windows環境で%~dp0%を使用して、
現在のスクリプト、つまり、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を使用している人のためのオプション:

set sourced =($ _)
scriptdir = dirname "$sourced[2]"
set scriptpwd = 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への参照を追加して、アクティベーションスクリプトを使用してこの50年前の問題を解決するための取り組みを統合するのに役立てます。

これは私が使用しているものです:

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 評価