gpt4 book ai didi

python - 在 C 和 Python 之间读写 Fifo 文件

转载 作者:行者123 更新时间:2023-11-30 15:05:15 32 4
gpt4 key购买 nike

一般来说,我正在创建两个 fifo 队列,供我的 .c 和 .py 程序读取和写入。为了使我的 .c 程序能够与 python 交互,我添加了 <python2.7/Python.h>图书馆。

首先,我的 .c 程序创建一个名为 CFifo 的文件,并使用 fprintf 向其中写入文本。没问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <python2.7/Python.h>


int main() {
FILE *CFifo, *pythonFifo, *pythonFile;
char buffer[1024];

// declare python
Py_SetProgramName("writer.py");

// init python
Py_Initialize();

// open python
pythonFile = fopen("writer.py", "r");

// C writes to file, python reads from this file
CFifo = fopen("./CFifo", "w");

// Print strings to file using fprintf
fprintf(CFifo, "This is a test");

// close file python reads
fclose(CFifo);

我的 C 程序的第二部分应该读取我的 python 程序写入的信息(在第二个 fifo 队列中),但在打开 ./pythonFifo 时它只是卡在终端中。 .

    // make second fifo queue
// python writes to this file, C reads from it
mkfifo("./pythonFifo", 0777);

// run python program
PyRun_SimpleFile(pythonFile, "writer.py");
pythonFifo = fopen("./pythonFifo", "r");

while(fgets (buffer, sizeof(buffer), pythonFifo)) {
printf("%s", buffer);
}

// close python
Py_Finalize();
fclose(pythonFifo);
remove("./pythonFifo");

return 0;
}

这是负责写入 fifo 队列的 python 部分。

# open fifo file that python writes to
filename_write = "./pythonFifo"
pipe = os.open(filename_write, os.O_WRONLY)
for output in finalStringList:
os.write(pipe, output)
os.close(pipe)

第二个文件的目的是写入从第一个文件读取的修改信息。

最佳答案

你无法从这里到达那里。从 mkfifo 手册页...

Once you have created a FIFO special file in this way, any process can open it for reading or writing, in the same way as an ordinary file. However, it has to be open at both ends simultaneously before you can proceed to do any input or output operations on it. Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa.

双方都需要打开文件才能继续。但由于 PyRun_SimpleFile 同步运行 python 脚本,因此永远不会到达打开文件的后面的 C 代码。如果您尝试先在 C 代码中打开它,它会在运行 python 代码之前挂起。你遇到了典型的僵局。

我在您的示例中添加了几个打印,并且能够看到程序的进展,就像我在单独的控制台中执行 cat pythonFifoecho foo > pythonFifo 一样。它当然返回了垃圾,但证明了问题所在。

实际上,您可以从这里到达那里(同样是手册页)

See fifo(7) for nonblocking handling of FIFO special files.

但是如果你的Python代码写入的内容超出了管道的容纳范围,你就会陷入更多的僵局。您最好让 python 程序写入某个变量,然后让 C 代码从那里读取它。

关于python - 在 C 和 Python 之间读写 Fifo 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39948721/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com