0

我正在尝试在项目中使用命名管道。我有两个终端打开,终端 A 和终端 B。

在终端 A,我发出了这个命令:

mkfifo myFifo && tail -f myFifo | csh -s

不过,似乎标准输出正在被重定向到其他地方,因为我的提示消失了,并且某些命令没有反映在终端 A 中。

例如,如果在终端 BI 中通过发出开始 python 会话echo "python" > myFifo,那么echo "print 'Hello, World'" > myFifo,我在终端 A 中看不到 Hello, World。

但是,如果我在终端 B 内发出,我会在终端 A 中echo ls > myFifo看到正确的输出。ls

有谁知道为什么有时会出现输出而有时却没有?

我在 CentOS 6.6 上运行

谢谢,埃里普

4

1 回答 1

0

您从 FIFO 中读取csh,如果您在 中启动交互式 Python shell csh,那么它将不会从 FIFO 中读取,因为它正忙于运行python

Python 不会以某种方式自动对 FIFO 执行 REPL。它甚至应该如何知道FIFO?它对此一无所知。

也许,你可以告诉 Python 从 FIFO 中读取命令,例如:

>>> import os, sys, time
>>> fifo = open(os.open('myFifo',  os.O_NONBLOCK), 'r')

接着:

$ echo 'print(42+5)' > ! myFifo  

会给你:

>>> eval(fifo.read())
47

也许还有一种方法可以告诉 PythonmyFifo通过覆盖读取命令sys.stdin,但我无法在我的测试中使用它。

不过,我有点不清楚你到底想在这里实现什么。我怀疑可能还有另一种更适合您遇到的问题的解决方案。

于 2015-07-15T09:33:25.607 回答