使用Python和subprocces.call执行脚本的问题仍然适用于Bash

这是我第一次在这里提出一点帮助,因为我更像是一个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的环境变量,但它们几乎是一样的…我会发布我得到的错误,但我不确定它与我的问题有关.

Use of uninitialized value $lines[0] in substitution (s///) at /usr/share/perl5/Config/IniFiles.pm line 614.
Use of uninitialized value $_ in pattern match (m//) at /usr/share/perl5/Config/IniFiles.pm line 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)

可悲的是,它没有改变任何事情……

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)

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

最佳答案 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以验证这是您要运行的命令(即检查替换).

点赞