子进程无法正确打印esxcli命名空间

时间:2014-06-11 20:53:38

标签: python subprocess vmware vsphere

当我从命令行执行esxcli时,命令如

esxcli --server=222.222.222.222 --username=foo@user.local --password='bar' --vihost=111.111.111.111 network vswitch standard portgroup add -p vlan1 -v switch1

工作正常。但是,从子进程调用总是会失败,因为它无法识别命名空间。这是因为它将命名空间和命令放在引号中,而不是直接添加它。我在子进程调用中的当前代码是:

import settings
import subprocess

subprocess.call(["esxcli",
                 "--server="+ settings.vserver,
                 "--username="+ settings.user,
                 "--password=\'"+ settings.pwd + "\'",
                 "--vihost="+ settings.host,
                 "network vswitch standard portgroup add",
                 "-p "+ settings.newpgname,
                 "-v "+ settings.newpgswitch])

当我运行subprocess.list2cmdline时,我得到:

esxcli --server=222.222.222.222 --username=foo@user.local --password='bar' --vihost=111.111.111.111 "network vswitch standard portgroup add" "-p vlan1" "-v switch1"

请注意,名称空间及其后的参数都在引号中。

我发现的关于子进程的大多数问题都涉及shell = True,而不是关于其他非连字符前缀的参数。

如何在没有额外引号的情况下使子进程运行正确的命令?

1 个答案:

答案 0 :(得分:2)

使用您的代码,您可以说可执行文件的第五个参数应该是字符串"网络vswitch标准端口组添加" 。为了在命令行上传递它,必须引用它。相反,你应该将它们作为单独的参数,就像它们在命令行上一样。这同样适用于标志参数;可执行文件并不期望单个参数" -v switch1" ,而是两个参数" -v" 和的"交换机1" 即可。因此你应该这样做:

subprocess.call(["esxcli",
                 "--server="+settings.vserver,
                 "--username="+settings.user,
                 "--password="+settings.pwd,
                 "--vihost="+settings.host,
                 "network","vswitch","standard","portgroup","add",
                 "-p",settings.newpgname,
                 "-v",settings.newpgswitch])