pythonとsubprocces.callを使用してスクリプトの実行を実行する問題
-
04-10-2019 - |
質問
初めて、私はServerFaultの人であるので、ここで少し助けを求めています。
私はPythonでいくつかのスクリプトを行っていますが、これまでのところ言語を愛していましたが、スクリプトが機能しないようにしているこの小さな問題があります。
問題のコード行は次のとおりです。
subprocess.call('xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd',shell=True)
OS.Popenで同じことを試しました。すべての変数が正しく設定されています。
通常のLinuxシェルで問題のコマンドを実行すると、完全に正常に機能しますが、Pythonスクリプトを使用して実行すると、奇妙なエラーが発生します。 SubProcess.call()を印刷関数に置き換えて、コマンドの正確な出力を使用していることを確認しました。
シェルの環境変数を調べましたが、それらはほとんど同じです...私が得ているエラーを投稿しますが、それが私の問題に関連しているかどうかはわかりません。
uninitialized value $ lines [0]の使用(s ///)at/usr/share/perl5/config/inifiles.pm line 614.パターンマッチ(m //)at/usrでの初期化値$ _の使用/share/perl5/config/inifiles.pm行628。
私はPythonの専門家ではないので、ここで何かを見逃している可能性が高いです。
よろしくお願いします、
アントワーヌ
編集
MIAXのアドバイスに従って、私はShell = trueの使用をやめました。代わりに、Pythonのドキュメントを見てみました サブプロセス 次のコードを使用しました。
cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd'
args = shlex.split(cmd)
subprocess.call(args)
悲しいことに、それは何も変えません...
編集2
MIAXで与えられたヒントを使用しましたが、まだ上記のエラーが発生します...これが私が使用したコードを紹介します。
cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd']
subprocess.call(cmd)
これは本当に奇妙です...正確なコマンドは、通常のシェルで実行するときに正常に機能します...
解決
どうしますか xen-create-image
スクリプトはハッシュバンから始めますか?つまり、最初の行です
#!/bin/sh
?それはチェックすべきことの一つです。もう1つは、コマンドを次のように呼び出すことができるということです。
cmd = ['/bin/sh', '-c', 'xen-create-image --hostname %s --memory %s --partitions=/root/scripts/part.tmp --ip %s --netmask %s --gateway %s --passwd' % (nom, memory, ip, netmask, gateway)]
subprocess.call(cmd, shell=False)
印刷したいかもしれません cmd
これを確認することは、実行するコマンドです(つまり、置換を確認します)。
他のヒント
(ほとんどの場合)サブプロセスを使用したくない shell=True
。コマンドに引数のリストを渡します。あれは
- より安全:ユーザーが合格することを想像してください
foo; rm -rf /; echo
いくつかの値として。 - より信頼性が高い:文字列の1つが含まれていると想像してみてください
$
または何か - シェルによって拡張され、その環境変数のコンテンツに置き換えられます。
あなたのコードを知らずに xen-create-image
, 、それがあなたの問題の原因だと思います。
PS:コマンドの出口コードがゼロであるかどうかを確認し、そうでない場合は適切に行動してください。 (あなたがそれが常にゼロになることを確信しているなら、使用してください check_call
, 、そうでない場合は上昇します。そうすれば、それが失敗した場合、少なくとも定義された動作があります。)
あなたの中で 編集2 失敗している例、あなた 考える 次のオプションを提供しています xen-create-image
:
--hostname
--memory
--partitions=...
- 等
...しかし、実際に次のオプションを指定しています。
--hostname
スペース- スペース
--memory
スペース - スペース
--partitions=...
- 等
あなたはこの行を持っています:
cmd = ['xen-create-image', '--hostname ', nom, ' --memory ', memory, ' --partitions=/root/scripts/part.tmp', ' --ip ', ip, ' --netmask ', netmask, ' --gateway ', gateway, ' --passwd']
しかし、あなたは余分なスペースを取り出す必要があります:
cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd']
必要がある print
使用しているコマンド:
cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd'
print "COMMAND:", cmd
そして、コマンドをシェルに貼り付けて、まったく同じであることを確認します。