Virtualenv: aktifkan mungkin gagal karena variabel tidak terikat saat dijalankan dengan set -eu

Dibuat pada 17 Mar 2017  ·  26Komentar  ·  Sumber: pypa/virtualenv

Tampaknya bug lama masih ada di sini: PS1: unbound variable saat dipanggil dengan mode ketat bash.

Jelas virtualenv membutuhkan pengujian menggunakan mode ketat bash dan set variabel lingkungan yang hampir kosong, jadi kami menghindari regresi di masa mendatang dalam hal ini.

Harap dicatat bahwa bug ini mereproduksi dengan APAPUN shell Unix yang didukung, tidak hanya bash , termasuk ksh dan zsh .

Berikut adalah cara sederhana untuk mereplikasi bug:

#!/bin/bash
# same applies to any other bourne compatible shells (is not bash specific)
set -euox pipefail
pip install -U virtualenv
virtualenv xxx
unset PS1
source xxx/bin/activate

Solusinya, meskipun jelek, adalah dengan menambahkan PS=${PS:-} ke baris aktivasi, yang mendefinisikan PS sebagai string kosong saat belum ditentukan, atau mempertahankan nilainya saat ditentukan.

Jenis bug yang sama berlaku untuk versi Python dari venv dan ada PR yang sudah

Tolong jangan tunda/tunda penerapan perbaikan hanya karena jenis bug yang sama ada di tempat lain. Perhatikan bahwa sintaks variabel ekspansi default kompatibel dengan POSIX dan bukan sesuatu yang baru atau mewah, fakta bahwa ini tidak diketahui oleh penulis aslinya tidak boleh menjadi alasan untuk tidak menggunakannya.

Komentar yang paling membantu

Saya juga digigit oleh ini, ketika mengerjakan skrip build untuk solusi pemrosesan gambar berbasis lambda AWS: https://github.com/awslabs/serverless-image-handler/blob/master/deployment/build-s3 -dist.sh

Saya telah menggunakan solusi VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate .

Semua 26 komentar

Saya juga menemukan ini, menjalankan virtualenv 15.1.0. Saya menggunakan lingkungan dalam pipa Nextflow, dan Nextflow berjalan dalam mode ketat secara default (https://github.com/nextflow-io/nextflow/issues/302). Sementara Nextflow dapat dikonfigurasi ulang untuk berjalan tanpa mode ketat, saya setuju dengan pengembang Nextflow bahwa akan lebih baik untuk menghindari penggunaan variabel tidak terikat, jika memungkinkan.

Saya tidak yakin persis bagaimana skrip activate dibuat, tetapi jika berasal dari Activate.sh , maka perbaikannya mungkin sesederhana mengubah $PS1 pada baris 57, 59 dan 61 menjadi ${PS1-} . (Sintaks ini akan menggunakan nilai PS1 jika tersedia, dan string kosong sebaliknya. Ini tidak mengubah nilai PS1 . Documentation ). Setidaknya, jika saya memodifikasi skrip activate dihasilkan di lingkungan saya seperti ini, pesan kesalahan akan hilang.

Saya bertanya-tanya berapa tahun yang diperlukan untuk mempelajari cara menulis kode bash .... bug variabel tidak terikat di virtualenv sudah berusia ribuan tahun dan sangat mudah untuk diperbaiki dan juga MENGHINDARI mereka di masa depan hanya dengan menambahkan baris sederhana ke tes virtual: set -euox pipefail .

Belum lagi berapa tahun yang dibutuhkan untuk perbaikan untuk menjangkau semua distro virtualenv di sekitar sana seperti yang biasanya dikemas pada debian, ubuntu, centos, rhel, fedora, .... :( :(

akankah pengelola proyek mengakui bahwa masalah ini ada?

Saya tidak tahu tetapi mengingat kami juga mendapat PR yang hampir dua minggu. Jawaban yang paling mungkin adalah bahwa mereka tidak memberikan ... submit.

Saya akan mencoba membuat keributan di irc, twitter, bahkan mungkin milis. Mungkin kita bisa menggabungkan perbaikan.

virtualenv adalah satu-satunya hal yang mencegah saya menjadikan bash mode ketat default pada pekerjaan CI.

+1

Saya pikir hanya menonaktifkan nounset di awal skrip dan memulihkannya di akhir mungkin lebih kuat daripada mencoba mengajari python devs cara bash :)

@jakub-bochenski mungkin Anda juga dapat membantu dengan beberapa komentar di irc. Mari kita lihat apakah kita bisa mendapatkan cukup banyak pengguna untuk membangunkan pengembang inti virtualenv.

@ssbarnea tidak yakin tentang itu, saya sudah lama tidak masuk ke IRC. Saya dapat mencoba membantu menghasilkan buzz di milis

mendesah...

+1

Saya mengirim email ke pypa-dev 7 hari yang lalu dan tidak mendapat balasan. Juga kemarin seseorang memposting bahwa biner win32 yang diinstal berisi trojan, sekali lagi tidak ada balasan. Saya hanya berharap trojan itu tidak benar-benar masuk ke distro, bukan itu akan mempengaruhi saya.

Lihat https://groups.google.com/forum/#!forum/pypa -dev

Mengalami ini hari ini, mengira itu adalah bug dalam kode saya di suatu tempat.
:+1: untuk memasukkan set -euo pipefail dalam unit test.

untuk referensi tautan langsung ke diskusi yang disebutkan di atas adalah: https://groups.google.com/d/topic/pypa-dev/8iVHDOqsj9M/discussion

@pfmoore menulis

Saya sudah menanggapi lebih detail pada daftar pengguna virtualenv,

.. yang ternyata adalah daftar python-virtualenv; https://groups.google.com/d/topic/python-virtualenv/5xKG8KoBl6g/discussion

FWIW, solusi yang saya gunakan di .devkit adalah mengatur VIRTUAL_ENV_DISABLE_PROMPT=true pada baris source . Ini berfungsi lebih baik untuk kasus penggunaan saya daripada mengatur PS1 , karena ini menonaktifkan perilaku pengaturan Prompt sama sekali.

@pjeby @jakub-bochenski @jpuskar @axd1967 Harap dicatat bahwa kami sudah memiliki perbaikan bug untuk ini tetapi untuk menggabungkannya kami perlu meninjau dan menggabungkan dua PR lainnya, itu hanya karena kami ingin dan perlu meningkatkan uji aktivasi- rangkaian.

  1. https://github.com/pypa/virtualenv/pull/1089 -- aktifkan pengujian CI pada py36 dan hapus py33
  2. https://github.com/pypa/virtualenv/pull/1087 -- aktifkan penggunaan skrip test_activate.sh pada CI
  3. https://github.com/pypa/virtualenv/pull/1078 -- perbaiki PS1 yang tidak terikat menjadi aktivasi

Mungkin Anda akan melihat bahwa dua yang terakhir tidak lulus tes CI, itu sebabnya kami membutuhkan yang lain digabung terlebih dahulu.

Harap tinjau/komentari mereka, itu lebih penting daripada proyek lain karena virtualenv tidak memiliki kekuatan peninjauan, ini menjadi salah satu alasan mengapa saya meminta untuk menjadi pengelola di https://groups.google.com/d/msg/pypa -dev/SgK9vlu93BY/F2_8OoKAAgAJ -- meskipun demikian, tampaknya kita akan membutuhkan lebih dari satu karena saya tidak akan dapat meninjau perubahan saya sendiri.

meskipun demikian, tampaknya kita akan membutuhkan lebih dari satu karena saya tidak akan dapat meninjau perubahan saya sendiri.

@ssbarnea apakah Anda meminta kami untuk juga mendapatkan izin pengulas, atau hanya melakukan ulasan dan meninggalkan +1/komentar?

EDIT: sudahlah tampaknya siapa pun dapat meninjau PR

1 selesai 2 lagi :)

Bisakah kami mendapatkan ETA kapan ini akan digabungkan dan tersedia untuk umum?

Sunting: Masih mendapatkan masalah ini, dan itu baru saja menurunkan build pagi ini.

Saya juga digigit oleh ini, ketika mengerjakan skrip build untuk solusi pemrosesan gambar berbasis lambda AWS: https://github.com/awslabs/serverless-image-handler/blob/master/deployment/build-s3 -dist.sh

Saya telah menggunakan solusi VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate .

@duaneking @robinbowes Ada kekurangan daya pemeliharaan di sekitar virtualenv dan jika Anda ingin membantu mengatasi masalah ini, silakan baca dan beri komentar di https://groups.google.com/forum/#!topic/pypa -dev/SgK9vlu93BY

Kesan saya adalah bahwa tim PYPA akan bereaksi hanya jika mendapat umpan balik komunitas yang cukup.

FTR kami masih menunggu penggabungan di #1087

Coba tebak apa contoh pertama untuk Menggunakan Mode Ketat Bash Tidak Resmi |

Ya, ini python 2 virtualenv.

Ubuntu 16.04

Perhatikan bahwa menggunakan bogdando/ tripleo-ci@318d17a akan mengganti mode ke -u meskipun sebelumnya tidak aktif. Bukan konstruksi praktik terbaik.

Ini akan mempertahankan status sebelumnya:

old_setting=${-//[^u]/}
...
if [[ -n "$old_setting" ]]; then set -u; fi

saat ini saya sarankan menggunakan patch (gunakan bash atau ubah sesuai kebutuhan Anda)
itu akan mulai gagal (berhenti berjalan) setelah penulis akhirnya berhasil memposting perbaikan ini, memberi Anda indikasi yang jelas tentang perubahan yang sedang dilakukan

set +H -euo pipefail
pushd "${envdir}"
patch -p0 <<< '
--- bin/activate 2018-10-12 09:08:16.991113929 +0200
+++ bin/activate 2018-10-12 09:27:51.505054528 +0200
@@ -54,11 +54,11 @@
 fi

 if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
-    _OLD_VIRTUAL_PS1="$PS1"
+    _OLD_VIRTUAL_PS1="${PS1:-}"
     if [ "x" != x ] ; then
         PS1="$PS1"
     else
-        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+        PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"
     fi
     export PS1
 fi
'
popd
. "${envdir}/bin/activate"
Apakah halaman ini membantu?
0 / 5 - 0 peringkat