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 shell 中执行有问题的命令时,它工作得非常好,但是当我使用我的 Python 脚本执行它时,我得到了奇怪的错误。我什至用 print 函数替换了 subprocess.call() 以确保我使用的是命令的确切输出。

我查看了我的 shell 的环境变量,但它们几乎相同......我会发布我遇到的错误,但我不确定它是否与我的问题有关。

在 /usr/share/perl5/Config/IniFiles.pm 第 614 行使用未初始化的值 $lines[0] 替换 (s///)。在 /usr 的模式匹配 (m//) 中使用未初始化的值 $_ /share/perl5/Config/IniFiles.pm 第 628 行。

我不是 Python 专家,所以我很可能在这里遗漏了一些东西。

预先感谢您的帮助,

安托万


编辑

按照 miax 的建议,我停止使用 shell=True。相反,我查看了subprocess的 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)

这真的很奇怪......当我在常规shell中运行它时,确切的命令工作正常......

4

4 回答 4

2

您(在大多数情况下)不想将 subprocess 与shell=True. 将参数列表传递给命令。那是

  • 更安全:想象一个用户设法传递foo; rm -rf /; echo一些值。
  • 更可靠:想象其中一个字符串包含 a$或其他内容 - 它将由 shell 扩展并替换为该环境变量的内容。

在不知道您的代码的情况下xen-create-image,我认为这是您的问题的原因。

PS:一定要查看该命令的退出码是否为零,如果不是则适当处理。(如果您确定它将始终为零,请使用check_call,如果不是,则会引发;这样,如果失败,您至少会有一个已定义的行为。)

于 2010-05-25T22:30:06.713 回答
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

然后将命令粘贴到您的 shell 中以确保它完全相同。

于 2010-05-26T00:47:40.813 回答
0

在您失败的Edit2示例中,您认为您正在为以下选项提供以下选项xen-create-image

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

...但您实际上是在指定以下选项:

  • --hostnamespace
  • space--memoryspace
  • space--partitions=...
  • ETC

你有这一行:

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

脚本是否xen-create-image以 hashbang 开头?也就是说,第一行类似于

#!/bin/sh

? 这是要检查的一件事。另一个是您可以尝试将您的命令称为:

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 回答