当前位置: 首页 > 面试题库 >

与popen python一起使用时,输入命令似乎不起作用

罗业
2023-03-14
问题内容

我正在编写一个执行scala命令的小型python应用程序。用户可以通过STDIN插入命令,然后python应用将其转发到scala解释器。执行命令后,应用程序将显示操作结果。

这个想法是用来Popen创建一个管道,通过该管道我可以发送命令并读取结果。这个想法很简单,但是没有用。我不明白的是,为什么在sys.stdin打开管道后它们不再起作用。这使得无法在python中读取命令。

这是我正在使用的代码:

import sys
from subprocess import Popen, PIPE

with Popen(["scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:
    while True:
        print("Enter scala command >>> ", end="")
        sys.stdout.flush()
        command = input()
        scala.stdin.write(command)
        scala.stdin.flush()
        print(scala.stdout.readline())

问题答案:

您需要从scala启动时开始读取所有行,然后以新行输入命令,并在获得以下两行输出之后:

from subprocess import Popen, PIPE

with Popen(["scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:
    for line in scala.stdout:
        print(line)
        if not line.strip():
            break
    while True:
        command = input("Enter scala command >>> \n")
        scala.stdin.write(command+"\n")
        scala.stdin.flush()
        for line in scala.stdout:
            if not line.strip():
                break
            print(line)

运行示例:

Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).

Type in expressions to have them evaluated.

Type :help for more information.



Enter scala command >>> 3+4
scala> 3+4

res0: Int = 7

Enter scala command >>> 4 * 4
scala> 4 * 4

res1: Int = 16

Enter scala command >>> 16 / 4
scala> 16 / 4

res2: Int = 4

为了使它能够通过使用不带缓冲区的bash运行,似乎可以解决输出问题:

from subprocess import Popen, PIPE

with Popen(["unbuffer", "-p","scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:
    for line in scala.stdout:
        print(line)
        if not line.strip():
            break
    while True:
        command = input("Enter scala command >>> ")
        scala.stdin.write(command+"\n")
        scala.stdout.flush()
        for line in scala.stdout:
            if not line.strip():
                break
            print(line)

如果您使用的是Mac Os x,则可能应该使用:

with Popen(["script", "-q", "/dev/null", "scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:

从bash:

        print(line)
## -- End pasted text --
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).

Type in expressions to have them evaluated.

Type :help for more information.



Enter scala command >>> 4 + 2
scala> 4 + 2

res0: Int = 6

Enter scala command >>> 4 * 12
scala> 4 * 12

res1: Int = 48

Enter scala command >>> 100 // 25
scala> 100 // 25

res2: Int = 100

Enter scala command >>>

有关外壳缓冲区问题的更多信息:

  • http://www.pixelbeat.org/programming/stdio_buffering/
  • https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe


 类似资料:
  • 我的代码看起来像 我的文件如下所示 当我运行程序时,我看到 我怎样才能修好它呢?

  • 我是Java新手,正在努力学习。我目前陷入困境,不知道为什么无法从文件夹导入。

  • 问题内容: 我在使用该功能时遇到了麻烦。 我只需要知道SQL查询是否返回零行。 我已经尝试过以下简单的语句: 类型是哪里。上面的代码似乎不起作用。无论是否为空,它将始终打印该消息。 我检查了SQL查询本身,当存在行时它正确返回了非空结果。 关于如何确定查询是否已返回0行的任何想法?我用谷歌搜索,找不到任何答案。 问题答案: ResultSet.getFetchSize()不返回结果数!从这里: 使

  • 我试图将JMX与activeMQ一起用于监控。到目前为止,我一直将其作为参考,但到目前为止我无法远程连接到JMX,而且我在activeMQ日志中没有看到任何提到JMX url的内容。我想知道是否有其他方法来确保jmx工作正常?它应该在activemq日志中显示吗?PS我正在使用jdk1.7和activeMQ 5.14.2。 提前感谢! 编辑 我在activemq.xml文件中设置了useJmx="

  • 我有一个工作流,它执行一系列模糊测试,最后计算所有崩溃程序子目录中的文件总数。后来,在另一份工作中,我使用该号码向Slack发送通知。但是,由于某些原因,不会产生任何输出,最重要的是,即使崩溃程序的数量不是零,下一个作业也不会运行! 有人知道我做错了什么吗?谢谢!

  • 问题内容: 即使将属性设置为,我仍然会插入重复的条目。 我设置了使用定期在。我没有用表 问题答案: 我没有使用JPA创建表 然后,您应该在语句中向表中添加唯一约束,例如,如果您使用的是MySQL: