1

bashラッパーを介してPythonスクリプトを呼び出していますが、引用符で囲まれたスペースを含む引数を処理するのに問題があります。

Pythonスクリプトの引数を次のようなbash変数にアセンブルします。

opt="-c start.txt"
opt+="--self 'name Na'"

次に、次のようなPythonスクリプトを呼び出します。

python test_args.py $opt

sys.argvPythonで印刷すると、

['test-args.py', '-c', 'start.txt', '--self', "'name", "Na'"]

期待される代わりに

['test-args.py', '-c', 'start.txt', '--self', 'name Na']

スクリプトを呼び出すときに、次のような配列を使用してみました

python test_args.py ${opt[@]}

しかし、私は

['test-args.py', "-c start.txt --self 'name Na'"]

他のアイデアはありますか?

4

3 に答える 3

4

配列を使用しますが、各引数を個別の要素として配列に格納します。

opt=(-c start.txt)
opt+=(--self 'name Na')

python test_args.py "${opt[@]}"

BashFAQ#050を参照してください。

于 2013-01-31T15:17:03.360 に答える
0

これがshlexモジュールの目的です。

shlexクラスを使用すると、Unixシェルに似た単純な構文の字句アナライザーを簡単に作成できます。これは、ミニ言語の記述(たとえば、Pythonアプリケーションの実行制御ファイル)や引用符で囲まれた文字列の解析に役立つことがよくあります。

于 2013-01-31T14:55:34.450 に答える
-1

変数の値の中にスペースを埋め込むという本能は良かったのですが、コマンドライン解析中に値を単純に展開すると、ご覧のようにそれらの特別な意味が失われます。Pythonスクリプトのコマンドラインを解析する前に、変数を展開する必要があります。

set -f
eval python test_args.py $opt
set +f

それは次のように拡張されます。

python test_args.py -c start.txt --self 'name Na'

その後、引用符が特別な意味を取り戻すことで、正しく解析されます。

編集:ファイルのグロブを無効にするために、evalの周りにset -f / + f(別名-/ + o noglob)を追加しましたが、これはOPの例では問題ではなく、evalの前代未聞の問題ではありませんでした。(もう1つの強力な注意点は、ユーザー入力が厄介なものに爆発しないように細心の注意を払わない限り、ユーザー入力を評価しないことです。評価する値を制御しないと、何が行われるかを確認できません。起こる。)

于 2013-01-31T15:24:16.883 に答える