【问题标题】:Unsupported operand type(s) for +: 'Popen' and 'str'' in subprocess.Popen [duplicate]+ 不支持的操作数类型:子进程中的“Popen”和“str”。Popen [重复]
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 问题是我需要禁用 shell=True。该命令适用于 shell=True
  • 您应该打印com 以查看发生了什么。如果您,如您所说,无法打印,请将其写入文件。 open("myfile", 'w').write(com1)
  • 谢谢,会试试的。
猜你喜欢
  • 2013-08-18
  • 2013-12-24
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多