【发布时间】:2014-06-11 20:53:38
【问题描述】:
当我从命令行执行 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 相关,而不是关于其他非连字符前缀的参数。
我怎样才能让子进程运行正确的命令,而不需要额外的引号?
【问题讨论】:
-
我最终只使用了旧的 os.system 调用。
-
要查看正确的参数列表应该是什么样子,请致电
shlex.split(shell_command)
标签: python subprocess vmware vsphere