2012-04-30 4 views
0

パスを開こうとしています。問題は、パスにファイルを開くのを困難にするさまざまな制御文字が含まれていることです。次のコードは、制御文字に接頭辞として\という最後の試みを示していますが、(エンドレスループのように)何度もファイルを何度も開きます。制御文字をPythonのシェルの引数として持つパス

path = path.replace("'", "\\'") 
path = path.replace("(", "\\(") 
path = path.replace(")", "\\)") 
try: 
    os.system("%s %s 2>/dev/null &" % (appForExtension[extension], path)) 
except: 
    print "not opened" 

は、あなたが標準的に制御文字の問題を回避os.system()コールでファイルを開く方法を知っていますか?

+0

それはあなたが生の文字列を使用することができます注目に値します( 'R「\ '」')バックスラッシュをエスケープ避けるために...読者への課題として残されています。 –

答えて

1

os.systemを使用する代わりに、subprocessモジュールを使用して、コマンドをシェルに渡さないようにすることができます。これは、引用符やその他のシェルメタキャラクタをエスケープすることを心配する必要がないことを意味します。一般に、パスの一部を解釈するシェル(誤解)を心配する必要はありません。 subprocess.callため

import subprocess 
res = subprocess.call([appForExtension[extension], path]) 

ドキュメントは言う:

subprocess.call = call(*popenargs, **kwargs) 
    Run command with arguments. Wait for command to complete, then 
    return the returncode attribute. 

...あなたは注意しましょうものsubprocess.callは、デフォルトでは、シェルを使用して回避を除き、os.systemと非常に似ています。 stderrをリダイレクト

+0

コマンドの完了を待たずに*&*を使用していてエラーメッセージが表示されないようにするため、* os.system()*を使用しました。そのため、* 2> dev/null/* – xralf

+0

... 'subprocess'モジュールを使って同じことができます。ドキュメントを見てみましょう。私はあなたがもっと柔軟にそれを見つけると思う。 – larsks

+0

標準エラー出力をリダイレクトするための引数* stderr = "/ dev/null" *を追加すると、ファイルは開かれません。ドキュメントでは、バックグラウンドでの実行については何も見えません。これで確実なら、私の議論を正しいものに修正してください。 – xralf

関連する問題