1

当我从命令行执行 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"

请注意,命名空间和它后面的参数都在引号中。

我发现的关于 subprocess 的大多数问题都与 shell=True 相关,而不是关于其他非连字符前缀的参数。

如何让子进程运行正确的命令,而无需额外的引号?

4

1 回答 1

2

使用您的代码,您是说可执行文件的第五个参数应该是字符串"network vswitch standard portgroup add"。为了在命令行上传递它,它必须被引用。相反,您应该将它们设为单独的参数,就像它们在命令行上一样。这同样适用于标志参数;可执行文件不需要单个参数"-v switch1",而是两个参数"-v""switch1"。因此你应该这样做:

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])
于 2015-01-15T13:31:22.933 回答