当我从命令行执行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,而不是关于其他非连字符前缀的参数。
如何在没有额外引号的情况下使子进程运行正确的命令?
答案 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])