7

Python 内から Perl スクリプトを実行しようとしていますが、stdout() で出力が得られませんが、シェルから実行するとスクリプトは完全に機能します。

まず、シェルから実行する方法を次に示します (正しいディレクトリにいると仮定します)。

./vmlinkedclone.pl --server 192.168.20.2 --username root --password root 
--vmbase_id 2 --vm_destination_id 41 --vmname_destination "clone-41-snapname" --snapname Snapname

#=> True, []
#=> or False, and a description of the error here 
#=> or an argument error

そして、これが私がPythonからそれを呼び出そうとする方法です:

cmd = ['/home/user/workspace/vmlinkedclone.pl', '--server', '192.168.20.2', '--username', 'root', '--password', 'root' ,'--vmbase_id', '2', '--vm_destination_id', '41', '--vmname_destination', 'clone-41-snapname', '--snapname', 'Snapname']
pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result = pipe.stdout.read()

print "Result : ",result
#=> Result :

シェルからスクリプトを実行すると目的の出力が得られ、Python からは何も得られないのはなぜですか?

4

1 に答える 1

9

試してみてください:

pipe = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

編集

エンコーディングに関連する問題がいくつか見つかりましたが、次の方法で解決しました。

import subprocess
cmd = ['/home/user/workspace/vmlinkedclone.pl', '--server', '192.168.20.2', '--username', 'root', '--password', 'root' ,'--vmbase_id', '2', '--vm_destination_id', '41', '--vmname_destination', 'clone-41-snapname', '--snapname', 'Snapname']
pipe = subprocess.Popen(cmd, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = pipe.communicate()
result = out.decode()
print "Result : ",result 
于 2012-11-19T10:17:51.140 に答える