Python +;的操作数类型不受支持:';波本';和';str'';在subprocess.Popen中

Python +;的操作数类型不受支持:';波本';和';str'';在subprocess.Popen中,python,subprocess,virtualization,ovf,ova,Python,Subprocess,Virtualization,Ovf,Ova,我正在查看这个脚本,以便在创建ova时禁用shell=True 它在shell=True时工作,但在shell=False时给我一个TypeError。 我很确定问题出在命令的这一部分-“vi:\/”+username+:“+encodedPassword+“@”+hostname”-因为当我从列表中删除此元素(即命令)时,脚本会向前移动。 我尝试过硬编码值,如“vi:\//用户:password@70.60.70.90“并且也被删除了,所以我仍然得到这个类型的错误 Python版本是2.7 c

我正在查看这个脚本,以便在创建ova时禁用shell=True

它在shell=True时工作,但在shell=False时给我一个TypeError。 我很确定问题出在命令的这一部分-
“vi:\/”+username+:“+encodedPassword+“@”+hostname”
-因为当我从列表中删除此元素(即命令)时,脚本会向前移动。 我尝试过硬编码值,如
“vi:\//用户: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命令有问题,因为当使用硬编码的
“hello”
替换vi:\/“+username+”:“+encodedPassword+”@“+hostname”时,脚本会向前移动。

如果使用大量参数,使用
字符串
可能比使用
参数列表
更容易,您可以通过设置
shell=True
。这也很容易调试,因为相同的命令(您应该打印)将以相同的方式从本机shell运行

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

请记住,
shell=True
可能会有安全问题,这取决于它的运行方式。

错误消息表明您的一个变量(不知道是哪一个)不是您期望的字符串,而是一个
Popen
对象。也许添加一些代码来打印它们(可能还有它们的
类型
s),看看哪里出了问题?你能给我们展示变量分配和完整的回溯吗?基本上,这意味着您正在使用
+
运算符添加两个不能求和的对象,但在不知道变量是什么的情况下,无法进一步操作。您能否在调用
subprocess.Popen()
之前至少打印
com1.split()
?不幸的是,我在这个脚本中记录和打印内容时遇到了问题。我需要弄清楚这段日志的去向。有东西挡住了。我是这些系统的新手,所以很遗憾,我还不能进行明显的调试打印。@dozer:公认的答案还建议使用
shlex
,这在这里会有所帮助。问题是我需要禁用shell=True。该命令适用于shell=true。您应该打印
com
以查看发生了什么。如你所说,如果你不能打印它,就把它写入一个文件<代码>打开(“myfile”,“w”)。写(com1)谢谢,我会试试的。