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