Python +;的操作数类型不受支持:';波本';和';str'';在subprocess.Popen中
我正在查看这个脚本,以便在创建ova时禁用shell=True 它在shell=True时工作,但在shell=False时给我一个TypeError。 我很确定问题出在命令的这一部分-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
“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)谢谢,我会试试的。