Virtualenv: set -euで実行すると、バインドされていない変数が原因でアクティブ化が失敗する場合があります

作成日 2017年03月17日  ·  26コメント  ·  ソース: pypa/virtualenv

古いバグがまだここにあるようです:bashstrictモードで呼び出されたときPS1: unbound variable

明らかに、virtualenvにはbash strictモードとほぼ空の環境変数のセットを使用したテストが必要なので、これに関する将来のリグレッションを回避します。

このバグは、 kshzshを含む、 bashだけでなく、サポートされているすべてのUnixシェルで再現されることに注意してください。

バグを再現する簡単な方法は次のとおりです。

#!/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

回避策は醜いですが、アクティブ化行の前にPS=${PS:-}を追加することです。これにより、PSがまだ定義されていない場合は空の文字列として定義されるか、定義されている場合はその値が保持されます。

同じ種類のバグがPythonバージョンのvenvにも修正するためのPRがすでに

同じ種類のバグが他の場所に存在するという理由だけで、修正の実装を延期/遅延しないでください。 デフォルトの拡張変数の構文はPOSIX互換であり、新しいものや派手なものではないことに注意してください。これが元の作成者に知られていないという事実は、それを使用しないことの言い訳にはなりません。

最も参考になるコメント

AWSラムダベースの画像処理ソリューションのビルドスクリプトで作業しているときにも、これに噛まれました: https

VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate回避策を使用しました。

全てのコメント26件

私もこれを見つけて、virtualenv15.1.0を実行しています。 Nextflowパイプライン内の環境を使用していますが、Nextflowはデフォルトで厳密モードで実行されます(https://github.com/nextflow-io/nextflow/issues/302)。 Nextflowは、厳密モードなしで実行するように再構成できますが、可能であれば、バインドされていない変数の使用を避けることが望ましいというNextflow開発者の意見に同意します。

activateスクリプトがどのように作成されるかは正確にはわかりませんが、 activate.shからのものである場合、修正は57、59、61行目の$PS1を次のように変更するのと同じくらい簡単かもしれません。 ${PS1-} 。 (この構文では、使用可能な場合はPS1の値を使用し、それ以外の場合は空の文字列を使用します。 PS1の値は変更されません。ドキュメント)。 少なくとも、生成されたactivateスクリプトをこのように環境で変更すると、エラーメッセージは表示されなくなります。

bashコードの記述方法を学ぶのに何年かかるのだろうかと思っています。virtualenvのバインドされていない変数のバグは古く、修正が簡単で、将来的には単純な行を追加するだけで回避できます。仮想テスト: set -euox pipefail

修正がその周辺のすべてのvirtualenvディストリビューションに到達するのに何年かかるかは言うまでもありません。これは通常、debian、ubuntu、centos、rhel、fedora、.... :( :( :(

プロジェクトのメンテナは、この問題が存在することを認めますか?

わかりませんが、2週間近く前のPRもあることを考えると。 最も可能性の高い答えは、彼らが...提出しないということです。

私はirc、twitter、多分メーリングリストでさえ騒ぎ立てようとします。 たぶん、修正をマージすることができます。

virtualenvは、CIジョブでbashstrictモードをデフォルトにすることを妨げる唯一のものです。

@ jakub-bochenski多分あなたはircに関するいくつかのコメントを手伝うこともできます。 virtualenvコア開発をウェイクアップするのに十分なユーザーを取得できるかどうかを見てみましょう。

@ssbarneaはそれについてよく

はぁ...

+1

7日前にpypa-devにメールを送信しましたが、返信がありませんでした。 また、昨日、インストールされたwin32バイナリにトロイの木馬が含まれていると誰かが投稿しましたが、これも返信はありません。 私は、トロイの木馬が実際にディストロに入っていないことを願っています。それが私に影響を与えることはないでしょう。

https://groups.google.com/forum/#!forum/pypa-devを参照して

今日これに遭遇し、それがどこかの私のコードのバグであると考えました。
:+1:ユニットテストにset -euo pipefailを含めること。

参考までに、上記のディスカッションへの直接リンクは次のとおりです。https

@pfmooreは書いた

virtualenv-usersリストで、すでに詳細に回答しました。

..これはpython-virtualenvリストであることが判明しました。 https://groups.google.com/d/topic/python-virtualenv/5xKG8KoBl6g/discussion

FWIW、 .devkitで使用している回避策は、 source行にVIRTUAL_ENV_DISABLE_PROMPT=trueを設定することです。 プロンプト設定の動作を完全に無効にするため、 PS1設定するよりも私のユースケースに適しています。

@pjeby @ jakub-bochenski @jpuskar @ axd1967これにはすでにバグ修正がありますが、マージするには、他の2つのPRを確認してマージする必要があります。これは、アクティブ化テストを改善する必要があるためです。スイート。

  1. https://github.com/pypa/virtualenv/pull/1089-py36でCIテストを有効にし、py33を削除します
  2. https://github.com/pypa/virtualenv/pull/1087-CIでtest_activate.shスクリプトの使用を有効にします
  3. https://github.com/pypa/virtualenv/pull/1078-バインドされていないPS1をアクティブ化するように修正

おそらく、最後の2つがCIテストに合格していないことがわかります。そのため、他の2つを最初にマージする必要があります。

それらについてレビュー/コメントしてください。virtualenvにはレビュー能力がないため、他のプロジェクトよりも重要です。これが、https://groups.google.com/d/msg/pypaでメンテナーになるように依頼した理由の1つです。 -dev / SgK9vlu93BY / F2_8OoKAAgAJ-それでも、自分の変更を確認できないため、複数必要になるようです。

それでも、自分の変更を確認することはできないので、複数必要になるようです。

@ssbarneaは、レビュー担当者の権限も取得するように求めていますか、それとも単にレビューを行って+ 1 /コメントを残すように求めていますか?

編集:どうやら誰もがPRをレビューできることを気にしないでください

1つあと2つあと2つ:)

これが統合されて一般に公開される時期についてETAを取得できますか?

編集:まだこの問題が発生しており、今朝ビルドがダウンしました。

AWSラムダベースの画像処理ソリューションのビルドスクリプトで作業しているときにも、これに噛まれました: https

VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate回避策を使用しました。

@duaneking @robinbowes virtualenvの周りにはメンテナンス能力が不足しています。この問題への対処を支援したい場合は、 https: //groups.google.com/forum/#!topic / pypa -dev / SgK9vlu93BYを読んでコメントして

私の印象では、PYPAチームは、十分なコミュニティフィードバックが得られた場合にのみ、これに対応します。

FTRはまだ#1087でのマージを待っています

非公式のBash厳密モードます|

はい、それはpython 2virtualenvです。

Ubuntu 16.04

  • 動作しません:VIRTUAL_ENV_DISABLE_PROMPT = true
  • 動作: https

bogdando / tripleo-ci @ 318d17aを使用すると、以前にアクティブでなかった場合でも、モードが-uオーバーライドされることに注意してください。 正確にはベストプラクティスの構成ではありません。

これにより、以前の状態が保持されます。

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

今はパッチを使用することをお勧めします(bashを使用するか、必要に応じて変更してください)
作成者が最終的にこの修正を投稿することに成功すると、失敗(実行の中断)が始まり、変更が行われていることが明確に示されます。

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"
このページは役に立ちましたか?
0 / 5 - 0 評価