2012-01-05 2 views
2

Popenでサブプロセスを作成しようとしています。ここに私のコードが最初にあります:Python - Popenのリストをコマンドとして使用する

hostname = 'host' 
servername = 'server' 
commandargs = ['/usr/sbin/mminfo',' -o n',' -s',servername,' -q "client=\'',hostname,'\',savetime>=last day"',' -r "client,name"'] 
process = subprocess.Popen(commandargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

問題は、実行されたコマンドが失敗し、連絡先のサーバーが利用できないというメッセージであることです。変数hostnameが使われていないようです... Popen(シェル= True)のコマンドとして、リストではなく文字列で同じことを試してみましたが、すべて正常に動作しています。

コードに間違いがあることを知っている人はいますか?

よろしくお願いいたします。 Stefan

+0

のようなものは、ホスト名、不要を引用しないでください。有効なホスト名には、奇妙なものに拡張される文字もスペースも含まれません。あなたがすべきことは、コマンド内の各エンティティを別々にして、 '-o n'ではなく-o、nのようにすることです。 – synthesizerpatel

+0

hostname = 'host' あなたは^ ?これはテストホスト名で変数を埋めるための私のテストです。 – StefanS

答えて

3

与えられたリストの各文字列は、単一のコマンドライン引数として扱われます。この構文を使用する場合は、引用符を使用する必要はありません。

するTryこのような何か:

hostname = 'host' 
servername = 'server' 
commandargs = [ 
    '/usr/sbin/mminfo', 
    '-o', 'n', # these are separate arguments, but on the same line for clarity's sake 
    '-s', servername, # same here 
    '-q', "client='%s',savetime>=last day" % hostname, # same here... 
    '-r', 'client,name' # and here. 
] 
process = subprocess.Popen(commandargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

編集:コメントに基づいてまたは、

import subprocess 

client_name = "lxds05" 
server_name = "nsr_srv" 

queryspec = "client='%s',savetime>=last day" % client_name 
reportspec = "client,name,savetime(17),nsavetime,level,ssflags" 

args = [ 
    '/usr/sbin/mminfo', 
    '-o', 'n', 
    '-s', server_name, 
    '-q', queryspec, 
    '-r', reportspec, 
    '-x', 'c' 
] 

subprocess.Popen(args) # ... etc 
+0

commandargs = [ '/ usr/sbin/mminfo'、 '-o'、 'n'、 '-s'、サーバー名、 '-q'、 'client' '、ホスト名' \ ' 、savetime> = last '、' '、' day ''、 '-r'、 '"クライアント、名前、savetime(17)、nsavetime、レベル、ssflags"'、 '-x'、 '"c; "'、 ' | sed '、'" 1d "'] – StefanS

+0

' shell'引数なしではパイプラインを使うことはできませんが 'sed'を使って行を削除するだけなら、それもPythonでもやってください。 – AKX

+0

私の貼り付けに申し訳ありません:-(編集したリストをここに入れようとしました – StefanS

6

リストでは、すべての引数がそれ自身の項目でなければなりません。文字列に空白を入れないでください。

+0

ありがとう、それはうまくいきます。 「最後の日」だけに空白があります。特別なキャラクターはありますか? – StefanS

+1

@StefanSいいえ、リストのポイントは、すべてのエスケープ処理をサブプロセスに行わせることです。 – phihag

+0

[OK]をクリックし、 ''のような文字を含むものは、それをエスケープする必要がありますか? – StefanS

関連する問題