【发布时间】:2016-05-06 18:29:02
【问题描述】:
我对 python 很陌生,现在我被一些东西困住了。我正在使用python 2.7。 我正在尝试在我编写了 python 脚本的 shell 中自动化一个命令。我必须向使用 Popen.communicate(input='2') 的 shell 输入一个整数值。虽然输入是传递的,但它是作为字符串传递的,子进程需要它作为数值。当我尝试将它作为 Popen.communicate(input=2) 之类的数字值传递时,它会引发以下错误:
TypeError: 'int' 对象没有属性 '__getitem__'
那么有没有办法将输入作为数值发送?
这是我使用的代码:
import sys
from subprocess import Popen, PIPE, STDOUT
cmd = ["sudo", "./sbt", "project java-examples", "run"]
proc = Popen(cmd, bufsize=4096, shell=False, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
string = proc.communicate(input='2')
print string[0]
proc.stdin.close()
编辑: 抱歉,我一开始没有提到这一点。 我的 java 应用程序有多个主类,因此编译器会询问要执行哪个类,并且我每次都需要输入相同的数字,这就是我试图自动化它的原因。当我传递一个字符串值时,它会抛出 numberformatexception。
【问题讨论】:
-
docs.python.org/2/library/… - “可选输入参数应该是要发送到子进程的字符串”,因此不,这是不可能的。这很好,因为管道是文本的,而不是 Python 对象,所以它需要一个“数字”值 2 而不是字符串“2”是没有意义的。那是什么意思?当你通过
input='2'时实际发生了什么? -
@TessellatingHeckler 子进程需要一个数字输入,而不是字符串输入,所以当我传递一个字符串值时,它会抛出一个“无效数字:java.lang.NumberFormatException:对于输入字符串:”“”。并且更改子进程的输入类型不是一种选择,因为它是由 shell 本身而不是子进程提示的。
标签: python-2.7 shell popen