2016-03-29 3 views
1

を使用すると、現在呼び出し:サブプロセスコマンドにおける変数(パイソン)

f = open('/tmp/list.txt','w') 
f.write(list) 
f.close() # Make sure to close the file before call sub-process. 
      # Otherwise, file content will not visible to sub-process. 

process = subprocess.Popen('oscommand --file={}'.format(f.name), 
          shell=True, stdout=subprocess.PIPE) 

を但し[ShortId] [1]を使用して生成された引数として変数を使用する必要があります。

u=ShortId() 
process = subprocess.Popen('oscommand --label "The unique id is "'+u' --file={}'.format(f.name), 
           shell=True, stdout=subprocess.PIPE) 

最高のエスケープ処理はどのように処理されますか?これは、どちらかのIDのリスクを回避

u=ShortId() 
cmd = ['oscommand', '--label', 'The unique id is {}'.format(u), '--file={}'.format(f.name)] 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 

:あなたはshell=Truestrコマンドをしようとして停止し、ちょうどshell=False(デフォルト)と、より安全、より速くlistベースのコマンドを使用する場合、これは実際には簡単です

+0

'.format(str(u))'を試したことがありますか? –

+0

文字列を 'Popen'コマンドに渡しています。文字列を書式設定して渡す前に変数として保存することができます。 – James

答えて

4

コマンドが誤って構文解析されるシェルメタキャラクタ(たとえば、スペース)を含むファイル名(または文字列が活発に悪意のある場合は危険です。たとえば、foo;sudo rm -rf /*というファイル)。

はまた、ファイルがPopenコマンドが終了した後に続くことになっているかどうか、一時ファイルを行うには良い方法があることに注意してください。

import tempfile 

with tempfile.NamedTemporaryFile('w+t', delete=False) as f: 
    f.write(mylist) 
... rest of code here ... 

また、ファイルは使用後に自動的にクリーンアップする必要がある場合:

with tempfile.NamedTemporaryFile('w+t') as f: 
    f.write(mylist) 
    f.flush() 
    ... rest of code using temp file ... 
+1

最後の引数でも '[...、 '--file'、f.name]'のように2つに分割できます。 '--arg = value'形式は、オプションとその引数を単一のシェルワードとして考えるのがより便利な状況(その時点では私は考えることができません)を意図しています。 – chepner

+0

@chepner:これは、使用している引数解析ライブラリに依存しますが、ほとんどの場合、同等に扱うことに同意します。 – ShadowRanger

+0

上記のようにShadowRanger "ファイルの読み込みに問題がある"// tmp/tmpULLmrW "" – dross

関連する問題