如何在Python中创建临时FIFO(命名管道)?这应该工作:
import tempfile
temp_file_name = mktemp()
os.mkfifo(temp_file_name)
open(temp_file_name, os.O_WRONLY)
# ... some process, somewhere, will read it ...
Run Code Online (Sandbox Code Playgroud)
但是,由于Python Docs 11.6中的重大警告以及潜在的删除,我犹豫不决,因为它已被弃用.
编辑:值得注意的是,我已尝试tempfile.NamedTemporaryFile(并通过扩展tempfile.mkstemp),但os.mkfifo抛出:
OSError -17:文件已存在
当您在mkstemp/NamedTemporaryFile创建的文件上运行它时.
当我在Python中打开用于写入的FIFO(命名管道)时,会发生一些非常奇怪的事情.考虑当我尝试打开FIFO以便在交互式解释器中写入时会发生什么:
>>> fifo_write = open('fifo', 'w')
Run Code Online (Sandbox Code Playgroud)
上面的行阻塞,直到我打开另一个解释器并键入以下内容:
>>> fifo_read = open('fifo', 'r')
>>> fifo.read()
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我不得不等待管道打开阅读,但我们跳过它.上述代码将阻塞,直到有预期的数据可用.但是,假设我回到第一个解释器窗口并键入:
>>> fifo_write.write("some testing data\n")
>>> fifo_write.flush()
Run Code Online (Sandbox Code Playgroud)
预期的行为是,在第二个解释器上,调用read将返回,我们将在屏幕上看到数据,除非发生在我身上.如果我打电话os.fsync给以下情况发生:
>>> import os
>>> fifo_write.flush()
>>> os.fsync(fifo_write.fileno())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
Run Code Online (Sandbox Code Playgroud)
而fifo读者仍在等待.但是,如果我打电话,fifo_writer.close()那么数据会被刷新.如果我使用shell命令来提供管道:
$ echo "some data" > fifo
Run Code Online (Sandbox Code Playgroud)
然后读者输出是:
>>> fifo_read.read()
'some data\n'
Run Code Online (Sandbox Code Playgroud)
有没有人经历过这个?如果是这样,有一个解决方法吗?我目前的操作系统是Ubuntu 11.04和Linux 2.6.38.
我想知道是否有Linux等效的Linux mkfifo.相当于我的意思是使用st_mode S_IFIFO创建文件的方式.谢谢你的回答.
我正在尝试使用PhantomJS将html页面呈现为pdf.我不想把文件写到磁盘上,我在内存中有html,我想在内存中使用pdf.
在这个问题上使用Pooria Azimi的优秀答案,我能够从命名管道中获取pdf.当在另一端尝试相同(用命名管道替换输入文件)时,我最终得到一个空白的pdf.
这就是我现在正在做的事情(简化):
mkfifo in_pipe.html out_pipe.pdf
./phantomjs rasterize.js in_pipe.html out_pipe.pdf
Run Code Online (Sandbox Code Playgroud)
然后在另一个终端:
echo '<center>hey!</center>' > in_pipe.html
cat out_pipe.pdf > out.pdf
Run Code Online (Sandbox Code Playgroud)
文件out.pdf已创建,但为空.我错过了什么吗?
情况:
new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO
data = os.read(new_pipe, 1024)
Run Code Online (Sandbox Code Playgroud)
读取偶尔会引发错误-11:资源暂时不可用.
什么时候出现这个错误?这似乎非常罕见,因为常见情况返回数据:
我正在使用命名管道来捕获另一个程序(Matlab)中的外部程序(wgrib2)的输出.Matlab代码如下所示,并system访问命令行以生成管道.这是我的问题:
myfifo使用后我是否必须关闭命名管道?代码运行后似乎仍然存在.myfifo需要关闭,关闭它的命令是什么?system('mkfifo myfifo'); % Make a named pipe myfifo
% Call the external program wgrib2 and dump its output to the named pipe myfifo
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo &');
fid = fopen('myfifo', 'r'); % Open the named pipe
a = fscanf(fid, '%c'); % Read the output as character
fclose(fid); % Close the "file" (myfifo still exists afterward)
Run Code Online (Sandbox Code Playgroud) 我使用mkfifo来创建一个命名管道.然后我使用以下程序打开它.但是,该程序挂起在"fopen"行.这里有什么问题吗?
int main(int argc, char** argv) {
char* line = "hello, world!";
FILE* fp = fopen("/tmp/myFIFO", "rw");
fprintf(fp, line);
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想使用os.mkfifo进行程序之间的简单通信.我在循环中读取fifo时遇到问题.
考虑这个玩具示例,我有一个读者和一个使用fifo的作家.我希望能够在循环中运行阅读器来读取进入fifo的所有内容.
# reader.py
import os
import atexit
FIFO = 'json.fifo'
@atexit.register
def cleanup():
try:
os.unlink(FIFO)
except:
pass
def main():
os.mkfifo(FIFO)
with open(FIFO) as fifo:
# for line in fifo: # closes after single reading
# for line in fifo.readlines(): # closes after single reading
while True:
line = fifo.read() # will return empty lines (non-blocking)
print repr(line)
main()
Run Code Online (Sandbox Code Playgroud)
而作者:
# writer.py
import sys
FIFO = 'json.fifo'
def main():
with open(FIFO, 'a') as fifo:
fifo.write(sys.argv[1])
main()
Run Code Online (Sandbox Code Playgroud)
如果我python …
我经历了不同的linux命名管道客户端/服务器实现,但大多数使用读/写的阻塞默认值.
因为我已经使用poll()来检查其他标志,所以通过poll()检查传入的FIFO数据也是个好主意...
经过所有研究后,我认为在O_RDWR模式下打开管道是在没有编写器打开管道时防止管道上无限数量的EOF事件的唯一方法.
这样管道的两端都是关闭的,其他客户端也可以打开可写端.为了回应我会使用单独的管道......
我的问题是,尽管我发现了一些使用O_RDWR标志的示例,但open()联机帮助页将此标志描述为在分配给FIFO时无法使用.(http://linux.die.net/man/3/open)
但是如何在没有O_RDWR的情况下在管道上使用poll()?你认为"O_RDWR"是打开管道的合法方式吗?
我想设置一个用Java读取的阻塞文件.也就是说,有一个文件,当包装FileInputStream和任何read()方法被调用时,调用块.
我想不出一个简单的与操作系统无关的方法 - 在类Unix操作系统上,我可以尝试使用mkfifo该文件创建FIFO 并从中读取.一个可能的解决方法是创建一个非常大的文件并从中读取 - 在捕获堆栈之前读取不太可能完成,但是它很丑陋而且很慢(实际上读取在缓存时仍然非常快).
相应的套接字read()案例很容易设置 - 自己创建一个套接字并从中读取,你可以有确定性的阻塞.
目的是检查方法的堆栈以确定在这种情况下顶框架是什么.想象一下,我有一个组件定期对所有正在运行的线程的堆栈跟踪进行采样,然后尝试对该线程当前正在执行的操作进行分类.它可以做的一件事是文件IO.所以我需要知道文件IO期间"堆栈顶部"是什么样的.我已经通过实验确定了(只是以各种方式读取文件并对堆栈进行采样),但我想编写一个如果这种情况发生变化就会失败的测试.
编写这样一个测试的自然方法是启动一个执行文件读取的线程,然后检查顶部框架.为了可靠地执行此操作,我想要一个阻塞读取(否则线程可能会在执行堆栈跟踪之前完成其读取等).