2011-12-05 7 views
5

os.systemコマンドを使用して、Python内からシェルへの呼び出しを正しくエスケープしています。私は同等のことをしようとしています:os.systemを使用してPythonからエスケープするシェルを正しく処理する

$ cat test | sort --stable -t $'\t' -k1,1 

から、それをシェルに渡します。

は、私が試した:

import os 
cmd = "cat %s | sort --stable -t $'\\t' -k1,1" %("test") 
os.system(cmd) 

が、私はエラーを取得:それはシェルから正常に動作するものの

sort: multi-character tab `$\\t' 

を。私は\tからPythonで余分なスラッシュを追加してエスケープしようとしましたが、他に何かが欠けているはずです。どのようにこれを修正することができます任意のアイデア?

ありがとうございました。

+0

することができますファイル名をソートするargとして渡し、 'cat file |'をスキップします。がんばろう。 – shellter

答えて

5

os.system通常のbash環境では期待通りにコマンドを実行しません。

import os 
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test" 
os.system(cmd) 

しかし、あなたはos.systemは非推奨としてマークされている、とのpythonの将来のバージョンで削除されることを認識する必要があります:あなたは、単に自分自身をbashの呼び出すことによって、それを回避することができます。あなたは将来性subprocess使用してコードすることができますの便利なメソッドcallを模倣os.systemの行動:

import subprocess 
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test" 
subprocess.call(cmd, shell=True) 

はあなたが興味を持っている場合は、サブプロセスモジュールとその呼び出しを行うために多くの方法があります。 http://docs.python.org/library/subprocess.html#module-subprocess

1

最初に、役に立たない猫の使用:http://google.com/search?q=uuocを避けるべきです。

第2に、あなたのソートコマンドがバックスラッシュ-tを理解していないことを確かめますか?これは動作するはずです:

sort --stable -t'\t' -k1,1 test 

をまたパイソンからだけで正常に動作する必要があります:あなたは(推奨)subprocessに切り替えた場合

os.system("sort --stable -t'\\t' -k1,1 test") 
# or 
os.system(r"sort --stable -t'\t' -k1,1 test") 

最後に、shell=Trueの使用を避ける:

subprocess.call(["sort", "--stable", "-t\t", "-k1,1", "test"]) 
関連する問題