4

私は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()をprint関数に置き換えました。

シェルの環境変数を調べましたが、ほとんど同じです...発生したエラーを投稿しますが、問題に関連するかどうかはわかりません。

/usr/share/perl5/Config/IniFiles.pm行614の置換(s ///)での初期化されていない値$ lines[0]の使用。/usrのパターン一致(m //)での初期化されていない値$_の使用/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)

悲しいことに、それは何も変更しません...


EDIT2

miaxから提供されたヒントを使用しましたが、それでも上記のエラーが発生します...使用したコードは次のとおりです。

cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd']
subprocess.call(cmd)

これは本当に奇妙です...通常のシェルで実行すると、正確なコマンドは正常に機能します...

4

4 に答える 4

2

あなたは(ほとんどの場合)。でサブプロセスを使用したくありませんshell=True。コマンドに引数のリストを渡します。あれは

  • foo; rm -rf /; echoより安全:ユーザーが値の一部として渡すことができたと想像してください。
  • $より信頼性が高い:文字列の1つにaまたは何かが含まれていると想像してください。これはシェルによって展開され、その環境変数のコンテンツに置き換えられます。

あなたのコードとを知らなくてもxen-create-image、それがあなたの問題の原因だと思います。

PS:コマンドの終了コードがゼロかどうかを確認し、ゼロでない場合は適切に動作してください。(常にゼロになることが確実な場合は、check_callを使用します。ゼロでない場合は上昇します。そうすれば、失敗した場合でも少なくとも定義された動作が得られます。)

于 2010-05-25T22:30:06.713 に答える
0

失敗しているEdit2の例では、次のオプションを指定していると思いxen-create-imageます。

  • --hostname
  • --memory
  • --partitions=...

...しかし、実際には次のオプションを指定しています。

  • --hostnamespace
  • space--memoryspace
  • space--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']
于 2010-05-25T23:04:44.873 に答える
0

print使用しているコマンドを実行する必要があります。

cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd'
print "COMMAND:", cmd

次に、コマンドをシェルに貼り付けて、まったく同じであることを確認します。

于 2010-05-26T00:47:40.813 に答える
0

xen-create-imageスクリプトはハッシュバンで始まりますか?つまり、最初の行は次のようなものです

#!/bin/sh

?それは確認すべきことの1つです。もう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これが実行しようとしているコマンドであることを確認するために印刷することをお勧めします(つまり、置換を確認します)。

于 2010-06-24T09:48:53.613 に答える