Virtualenv: --relocatable tidak mengarahkan skrip aktivasi ke jalur yang benar

Dibuat pada 14 Mar 2011  ·  14Komentar  ·  Sumber: pypa/virtualenv

Menggunakan Ubuntu 10.04, --relocatable berfungsi jika saya langsung memanggil biner python atau skrip yang dihasilkan setuptools. Namun, bin/aktifkan masih mencerminkan jalur lama:

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

Ini karena VIRTUAL_ENV diatur ke jalur absolut dalam skrip. Sebaliknya, ini harus dibuat relatif ketika --relocatable dipanggil.

Karena skrip aktivasi harus bersumber, sedikit lebih rumit untuk mendapatkan jalur daripada hanya (misalnya) dirname $0 . Berikut ini tampaknya berfungsi di 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)

Jika ini sesuai dengan persetujuan Anda, Ian, saya senang menulis tambalan.


bug

Semua 14 komentar

maaf untuk format yang buruk .... bitbucket menipu saya lagi :(


Original Comment By: Jeff Hammel

Dan %~dp0% dapat digunakan di lingkungan windows untuk mendapatkan jalur ke
skrip saat ini, yaitu untuk mengaktifkan.bat.


Original Comment By: Sylvain Prat

Saya pikir itu ide yang bagus, patch akan bagus.


Original Comment By: Jannis Leidel
  • Konten yang diubah.

Original Comment By: Jannis Leidel

Ini adalah versi yang lebih baik untuk bash:

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

Dan untuk (t)csh:

set sourced=($_)

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

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

setenv VIRTUAL_ENV `dirname "$scriptpwd"`

Original Comment By: Anonymous

Inilah yang saya gunakan:

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

$BASH_SOURCE)))"

atau dengan opsi pendek

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

Original Comment By: Matteo Bertini

Dan opsi bagi mereka yang masih menggunakan tcsh:

set sumber=($_)
set scriptdir= dirname "$sourced[2]"
set scriptpwd= cd "$scriptdir"; pwd
setenv VIRTUAL_ENV dirname "$scriptpwd"

Saya telah membuat permintaan tarik untuk perubahan ini (yang hanya mengimplementasikan skrip bash):
https://github.com/pypa/virtualenv/pull/143

Untuk windows, di ACTIVATE_BAT Anda dapat mengganti:

set VIRTUAL_ENV=__VIRTUAL_ENV__

dengan:

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

Ini lebih baik daripada hanya mengaturnya ke %~dp0.. secara langsung karena Anda berakhir dengan jalur absolut yang sama dengan yang Anda lakukan tanpa perubahan, tetapi dapat dipindahkan.

Menambahkan referensi ke edisi terbaru #1067 yang terkait dengan ini untuk membantu mengkonsolidasikan upaya memecahkan masalah lama setengah dekade ini dengan skrip aktivasi.

Inilah yang saya gunakan:

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

$BASH_SOURCE)))"

atau dengan opsi pendek

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

Menggunakan readlink bisa menjadi masalah, karena memiliki opsi baris perintah yang berbeda antara Linux, BSD/macOS, dan kemungkinan rasa Unix lainnya.

@adah1972 , edisi #1067 adalah yang terbaru. Masalah ini dari 2012, #1067 dari 2017.

@arizvisa Terima kasih. Saya berkomentar di # 1067 juga.

Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Cukup tambahkan komentar jika Anda ingin tetap membukanya. Terima kasih atas kontribusi Anda.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat