+:' Popen'不支持的操作数类型和' str''在subprocess.Popen中

时间:2018-06-18 07:15:39

标签: python subprocess virtualization ovf ova

我正在查看此脚本以在创建ova时禁用shell = True。

它在shell = True时有效但在shell = False时给我一个TypeError。 我非常确定问题的这一部分是问题 - " vi:\//" + username + ":" + encodedPassword + "@" + hostname" - 因为当我从列表中删除此元素(即命令)时,脚本会向前移动。 我尝试过对"vi:\//user:password@70.60.70.90"这样的值进行硬编码,也删除了,但我仍然遇到此类错误。

Python版本是2.7

com1 = "/usr/bin/ovftool --acceptAllEulas --disableVerification --noSSLVerify --datastore=" + datastore +
           " --network=\"" + network + "\" --name=" + name + " " + ovalocation + " vi:\//" +  username +
          ":" + encodedPassword + "@" + hostname

#prior to disabling shell=True
# coms = subprocess.Popen(com1, shell=True,
  #                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# set shell=False - now it requires the command to be a list rather than a string.
coms = subprocess.Popen(com1.split(), shell=False,
                       stdout=subprocess.PIPE, stderr=subprocess.PIPE)

错误:

'unsupported operand type(s) for +: 'Popen' and 'str''

我做错了什么?

编辑: 我知道这是vi命令的问题,因为当用脚本向前移动的硬编码"vi:\//" + username + ":" + encodedPassword + "@" + hostname"替换"hello"时。

1 个答案:

答案 0 :(得分:-2)

如果您使用了大量参数,可以通过设置string来更轻松地使用list of arguments而不是shell=True。这也很容易调试,因为相同的命令(你应该打印)将以相同的方式从本机shell运行。

coms = subprocess.Popen(com1, shell=True,
                   stdout=subprocess.PIPE, stderr=subprocess.PIPE)

请记住,shell=True可能存在安全问题,具体取决于运行方式。