C++启动脚本(BASH,Python…)使用stdin/stdout进行数据传输[linux]

2024-05-12 21:07:23 发布

您现在位置:Python中文网/ 问答频道 /正文

< >我想从C++代码中调用python脚本。python脚本如下所示:

    hello.py
    #!/usr/bin/python
    import sys
    print "Hello!"
    Readin = sys.stdin.read()
    print Readin
< > C++代码来自堆栈溢出的另一个问题。它应该如何工作:

  • 创建一对管道。

  • 使用fork()创建子进程。

  • 孩子正在将管道弯曲到stdin/stdout。关闭另一端 开始写剧本。

  • 父亲正在监听管道read(),接收输入。之后, 正在发送消息write()

当输入switch (readResult = read(childToPa...时,程序不会从父亲行返回。在

我也不知道这个写作部分是否在发挥作用。这样做是一个很有前途的想法,还是有其他可行的方法? 谢谢!在

它看起来像:

^{pr2}$

Tags: 代码pyimport脚本helloreadbin管道
1条回答
网友
1楼 · 发布于 2024-05-12 21:07:23

您的问题是缓冲输出、未关闭的文件描述符以及使用EOF来发出传输的部分结束的信号。前两个问题可以解决,但最后一个问题需要不同的方法。稍后再谈。在

循序渐进:

Python正在使用缓冲I/O,因此您可能希望通过在第一个print语句之后添加一行sys.stdout.flush()来强制Python刷新输出。现在"Hello!\n"被逐字读取。在

但是下一个read将阻塞,直到新字符到达或管道关闭。Python脚本的STDUT仍然是打开的,C++程序正在等待某些东西到达,但是Python脚本本身也在等待一些输入。典型的死锁。在

您可以放弃python脚本中的最后一次打印,并尝试关闭其STDOUT。由于read将一直阻塞,直到引用管道写入端的所有文件描述符都关闭,因此必须在flush之后添加os.close(sys.stdout.fileno())和{}。在

但仍有有效的文件描述符引用该管道的写入部分。还记得C++源中的^ {CD8}}吗?在这三行dup2之后,仍然有parentToChild[READ_FD]和{}引用脚本STDIN和STDOUT。所以我们必须关闭它们。在dup2后面添加close(parentToChild[READ_FD]);close(childToParent[WRITE_FD]);。现在,read在Python脚本关闭STDOUT和STDERR时返回0。在

接下来,父进程发送"{\"AElement\":\"Something\"}\0",并到达waitpid,当子进程退出时返回。但孩子还在读STDIN的书。所以你必须在waitpid之前加上close(parentToChild[WRITE_FD]);。在


现在是概念部分:您不能read(),直到它返回一个0(pipeclosed),然后继续从这个封闭的管道中读取。您的选择:

  • 读一次直到管道关闭。不可能有第二条消息。在
  • 知道要读多少。预先或通过解释接收到的字节。在
  • 监视两个管道,例如使用poll(2)并动态决定是否要读或写。在

顺便说一句:execlp的参数是const char *file, const char *arg, ...,其中arg, ...是通常的char *args[],以{}(!)开头以空指针结束。请将该行改为int retexe = execlp(target, target, (char*) NULL);


#!/usr/bin/python2.7

import os
import sys

print "Hello!"
sys.stdout.flush()
os.close(sys.stdout.fileno())
os.close(sys.stderr.fileno())

data = sys.stdin.read()
with open("data_received_by_child.txt", "w") as fp:
    print >>fp, data

^{pr2}$

相关问题 更多 >