当我从命令行执行 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 相关,而不是关于其他非连字符前缀的参数。
如何让子进程运行正确的命令,而无需额外的引号?