+的操作数类型不受支持:中的“Popen”和“str”子流程.Popen

2024-10-04 03:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在查看这个脚本,在创建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)

错误:

^{pr2}$

我做错什么了?在

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


Tags: 命令脚本falsetrue编码错误usernameshell
1条回答
网友
1楼 · 发布于 2024-10-04 03:22:17

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

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

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

相关问题 更多 >