2011-01-25 6 views
2

サブプロセスと引用符に問題があります。pythonサブプロセス呼び出しbashスクリプト - 引用符も出力する必要があります

私のPythonスクリプトは、ユーザーの入力を受け取り、ちょっと回りますが、この方法で結果をbashスクリプトに送る必要があります。

myscript.sh 'var1 == a var2 == b; othervar == c' /path/to/other/files 

ここで、私が悩んでいるのは、一重引用符です。 Pythonはそれらを取り除こうとします。

私はこれをテストに使用しました。

subprocess.Popen([myscript.sh 'var=11; ignore all' /path/to/files], shell=True, executable="/bin/bash") 

2番目の一重引用符を指す無効な構文を返します。私はまた、角括弧なしで上記を試してきましたが、一重引用符を外側と二重引用符で囲んで使用しています。

その他のものです。

私が上記の 'var == a var == b; othervar == c 'はPythonスクリプト(文字列形式)から派生しています。このようなサブプロセスで呼び出す必要があります。

subprocess.Popen([myscript.sh myvariables /path/to/files], shell=True, executable="/bin/bash") 

最初の例のように、myvariablesの値を一重引用符で囲むだけでよいのです。

私が正しい方法をどこから外しているかについての指針はありますか?

ありがとうございます。リストだ

+0

私は今日このエラーがあると思います。人々はこれが遠隔的に有効な構文だと思うのですか?リスト項目はコンマ、ピリオドで区切られています。空の 'foo'は文字列' 'foo ''とは何の関係もありません。 (また、あなたが引用している例を罰金することはできませんでした。行番号を与えてもらえますか?) – delnan

答えて

6
シェル= Trueのはpopenのに渡されると

は、あなたが上で送信し何でも渡しますコマンドライン。つまり、あなたのリストは1つの要素しか持たないはずです。ですから、例えば:

subprocess.Popen(['myscript.sh "var=11; ignore all" /path/to/files'], shell=True, executable="/bin/bash") 

た場合、または/パス/に/ファイルはPython環境での変数です:

subprocess.Popen(['myscript.sh "var=11; ignore all" %s' % path_to_files], shell=True, executable="/bin/bash") 

は、私は強くは、シェルの引数を使用することができない奨励と述べました。理由は脆弱です。あなたはこのようにそれを行うためのはるかに堅牢な方法を取得します:

subprocess.Popen(["/bin/bash", "myscript.sh", "var=11; ignore all", path_to_files]) 

。なお、「varは= 11;すべてを無視し、」スクリプトへの引数として渡されます。これらが別々の引数である場合は、別々のリスト要素にします。

+1

'shell = True'を使わないもう一つの理由は、入力がどこから来るのかによって安全性が損なわれることです。あなたのシステム上で他のコマンドを実行する入力を与えることが可能です。 –

+0

はshell = Trueでは動作させることができませんでしたが、これはうまくいきました。 "%s"%s '%(varfilter、thepath)]、シェル= True、実行可能ファイル= "/ bin/bash"サブプロセス.Popen([' myscript.sh " – Chasester

0

は、それらは、その中に文字列であるので、それらは引用符が必要です。

["myscript.sh", "var=11; ignore all", "/path/to/files"] 

動作するはずです。あなたのスクリプトは本当に何とか引用符に依存している場合は、(私はどのようにサブプロセスの作品の詳細を知らない)、これを試してみてください。

["myscript.sh", "'var=11; ignore all'", "/path/to/files"] 
+0

私は 'サブプロセス'が必要なときに引用符を追加すると考えています - もしそれがシェルを全く通らないならば(私はプログラムを呼び出す方法と、実行可能な名前と引数を一つに)) – delnan

+0

@delnan:はい、私はあなたが正しいと思います。更新しました。 –

+0

この場合、実際にはそうではありません。 shell = Trueを使用している場合、サブプロセスによってシェルは引用符を抽出します。文字通りコマンドラインで入力するものです。 –

2

これはなぜ機能するのかは確認していませんが、shell = Trueの必要はありません。

subprocess.Popen(["/bin/bash", "myscript.sh", '""' + string_to_be_quoted + '""', path_to_files]) 
関連する問題