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

在不中断管道的情况下与一个进程多次通信?

双俊人
2023-03-14
问题内容

这不是我第一次遇到这个问题,而且确实困扰着我。每当使用Pythonsubprocess模块打开管道时,只能communicate使用一次,如文档所示:Read data from stdout and stderr, until end-of-file is reached

proc = sub.Popen("psql -h darwin -d main_db".split(),stdin=sub.PIPE,stdout=sub.PIPE)
print proc.communicate("select a,b,result from experiment_1412;\n")[0]
print proc.communicate("select theta,zeta,result from experiment_2099\n")[0]

这里的问题是Python第二次不满意。实际上,他决定在第一次交流后关闭该文件:

Traceback (most recent call last):
File "a.py", line 30, in <module>
    print proc.communicate("select theta,zeta,result from experiment_2099\n")[0]
File "/usr/lib64/python2.5/subprocess.py", line 667, in communicate
    return self._communicate(input)
File "/usr/lib64/python2.5/subprocess.py", line 1124, in _communicate
     self.stdin.flush()
ValueError: I/O operation on closed file

是否允许多种通讯?


问题答案:

我认为您误会了沟通…

http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate

通讯将字符串发送到另一个进程,然后等待它完成…(就像您说的那样,等待EOF侦听stdout和stderror)

相反,您应该做的是:

proc.stdin.write('message')

# ...figure out how long or why you need to wait...

proc.stdin.write('message2')

(如果需要获取stdout或stderr,则可以使用proc.stdout或proc.stderr)



 类似资料:
  • 我是函数式编程新手,我正在努力变得更好。 目前,我正在试验一些代码,采用以下基本形式: 首先,使用hashmap获取列表中每个数字的频率。下一步,我们总结出地图中作为键存在的键的数量。 我不喜欢的是,这两个流需要彼此分开存在,其中一个HashMap是由一个流生成的,只会被另一个流立即独占地使用。 有没有一种方法可以将其合并为一个流?我是这样想的: 但这里的问题是没有可参考的freq map,因为它

  • 我有一个开关案例,我想用双管引导3个不同的可能案例到一个结果。

  • 我试图发送信号从我的pyObc gui(osx状态栏中的菜单)到我的应用程序的主进程。具体来说,我在一个类中运行gui,在一个进程中运行this,我试图通过管道将消息从gui发送到主进程。 当我使用一种简单的方法将数据放入管道中时,我的代码可以工作。消息被传递到主进程,产生当我在子流程中启动gui并尝试将数据放入管道时,比如当我单击菜单选项“开始”时,什么都不会发生。主流程线从未打印,据我所知,主

  • 问题内容: 我一直在努力在DigitalOcean上运行多个Puppeteer实例,但运气不好。我可以使用puppeteer- cluster之 类的工具同时运行〜5个,但是由于某种原因,整个过程几乎没有什么有用的消息。因此,我切换为在没有任何其他库的情况下生成〜5个子进程- 仅是Puppeteer本身。同样的问题。窒息而没有有用的错误。 我可以在本地很好地运行所有这些工作,但是在部署之后,我碰壁

  • 在javaFx中,对于每个带有FXID的控件,我们可以在每个生成的控制器类的initialize方法中看到以下语句。 我可以理解,该语句是为了确保在加载这个fxml时,带有这个fx:id的控件出现在fxml布局文件中,如果该控件不存在,它将抛出异常并退出fxml加载过程。 null

  • 我在处理多维数组时遇到问题。我试图使用指针让“123”、“456”、“x123”和“x456”出现在函数内部的屏幕上: 编译时,我在