2016-05-28 20 views
0

まず、セットアップと目標についてのビット。私はCoreがインストールされており、Pythonスクリプトからいくつかのコマンドを実行したいというセッションが実行されています。いくつかのコマンドしかなく、かなり単純なコマンドなので、subprocess.Popencoresendmsgのキックに使用すると、スクリプトにコアコントロールプレーンを実装しようとしたのではないでしょうか。私のpythonからこのコマンドを実行するとcoresendmsgが適切にcmdと引数を解析持ついくつかの問題を持っていたPopen()からスクリプトが呼び出されたときに、スクリプト引数が正しく解析されない

coresendmsg exec node=2 num=1001 cmd='ifconfig eth0 192.168.0.1' 

次のように

(CLIから実行される)コマンドの例があります。以下のように実行すると、coresendmsgはeth0と192.168.0.1を別々の引数とチョークとみなします。これは意味があります。

s=subprocess.Popen(['coresendmsg', 
    'exec', 
    '-s 47854', 
    'node=2', 
    'num=1001', 
    'cmd=ifconfig eth0 192.168.0.1']) 

私は、次のように変更した場合、coresendmsgは現在、1つの引数としてCMDを考慮しますが、引数がcoresendmsgに分割されている場合、単一引用符が含まれるようになりましたので、まだチョーク。これは、上記の例のように、同じ引用符でコマンドラインからcoresendmsgを実行すると異なります。

s=subprocess.Popen(['coresendmsg', 
    'exec', 
    '-s 47854', 
    'node=2', 
    'num=1001', 
    'cmd=\'ifconfig eth0 192.168.0.1\'']) 

私が入り、coresendmsgを修正して引数を表示し、両方のケースをチェックしたので、私はこれを知っています。 CLIからの実行上記のコマンドは、私はこれを参照する場合:

['exec', 'node=2', 'num=1001', 'cmd=ifconfig eth0 192.168.0.1'] 

をしかしパイソンから実行したとき、私は私が物事を引用する方法に応じて、以下のいずれかを取得します:

['exec', 'node=2', 'num=1001', 'cmd=ifconfig', 'eth0', '192.168.0.1'] 
['exec', 'node=2', 'num=1001', "cmd='ifconfig eth0 192.168.0.1'"] 
['exec', 'node=2', 'num=1001', 'cmd="ifconfig eth0 192.168.0.1"'] 

私がこの仕事をすることができますbashスクリプトですが、スクリプトから、スクリプトからスクリプトを実行するのではなく、むしろ実行します。この問題を解決する可能性のある候補を探してください。

+2

「-s 47854」があることに気付きました。それを '' -s '、' 47854 'に変更してみてください –

答えて

1

@HaiVuの説明を明確にするために、cmdパラメータではなく、-s 47854のために最初の例が失敗します。あなたの例では、単一のパラメータ"-s 47854"が渡されました。プログラム内の引数がどのように解析されるかによって、-sの値はnode=2になります。

リストを使用しているので、スペースはそれほど別々の引数は、ありません:

s=subprocess.Popen(['coresendmsg', 
    'exec', 
    '-s', '47854', 
    'node=2', 
    'num=1001', 
    'cmd=ifconfig eth0 192.168.0.1']) 

あなたの実験引用の違いとは予想されています。シェル( "コマンドライン")から実行すると、シェルは引用符を取り除きます。 Pythonから実行すると、それについて考えても引用符が取り除かれます。引用符をエスケープすると、それらは直接Pythonとbashの両方で渡されます。

追加のシェル動作が必要な場合は、shell=TrueのパラメータをPopenに設定します。この場合、これは必須ではなく、ほとんどの場合避けることができます。

関連する問題