【发布时间】:2018-06-18 07:15:39
【问题描述】:
我正在查看此脚本以在创建 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 命令的问题,因为当用硬编码的 "hello" 替换 "vi:\//" + username + ":" + encodedPassword + "@" + hostname" 时,脚本会向前移动。
【问题讨论】:
-
错误消息表明您的变量之一(不知道是哪个)不是您期望的字符串,而是
Popen对象。也许添加一些代码来打印它们(也许是他们的types),看看你哪里出错了? -
你能告诉我们变量赋值和完整的回溯吗?基本上这意味着您正在使用
+运算符添加两个无法总结的对象,但不知道您的变量是什么,就不可能更进一步。 -
在致电
subprocess.Popen()之前,您至少可以打印com1.split()吗? -
不幸的是,我无法在此脚本中记录和打印内容。我需要弄清楚这个日志的去向。有什么东西阻碍了这一点。我是这些系统的新手,所以很遗憾我还不能进行明显的调试打印。
-
@dozer:接受的答案还建议使用
shlex,这可能会有所帮助。
标签: python subprocess virtualization ovf ova