【问题标题】:Inter process communication from python to cpp program从python到cpp程序的进程间通信
【发布时间】:2021-12-27 07:19:05
【问题描述】:

假设有 3 个文件:f1.cpp、f2.py、f3.cpp。 我在linux终端上运行命令如下:

$./f1.out | python3 f2.py | ./f3.out

f1 的输出完美地进入 f2 的输入。此外,f2 的输出完美地进入 f3。我在 f3 中显示输出。 f1 在特定间隔后为 f2 生成输入。在此时间间隔内,我需要在 f3 文件中输入用户输入,以便它可以在暂停期间相应地给出输出。 我尝试调试我的代码,我发现虽然我没有用户输入的最终输出是由 f3 生成的,但我的用户输入没有被读取。有人帮忙!!

【问题讨论】:

  • f3 正在读取 f2 的输出,现在它无法从控制台读取输入。您可以打开另一个输入来读取 tty 设备并读取用户输入。看例子unix.stackexchange.com/questions/138342/…
  • f1 正在读取用户输入,您需要以某种方式传递它
  • @AlanBirtles 据我说,f2 正在阅读它。我尝试在 f2 中打印我的输入,但它没有打印。当我按 ctrl+C 退出时,它会在 f2 文件中给出一个键盘中断。我被困在这个:(
  • f1 除了输入之外别无他法,因为其中没有任何 cin 行
  • 无论您在哪里尝试读取输入,控制台都会输入f1f1 的输出是f2 的输入,@987654327 的输出@ 是f3 的输入,f3 的输出进入控制台

标签: python c++ ipc


【解决方案1】:

由于您已经在命令中声明 f3 应该从 f2 的输出中获取输入,而 f2 应该从 f1 的输出中获取输入,所以现在没有直接的方法可以将控制台输入提供给 f3。

这里最好的方法是(假设你也只是 f1 和 f2 的作者)你可以只在 f1 中读取用户输入并立即打印它

cin >> input;
cout << input;

以便将其传递给 f2 的输入。你也可以在 f2 中做类似的事情

inp = str(input)
print(inp)

因此根据需要将其传递给 f3。

但如果你不想这样做,或者你不是 f1 和 f2 的作者,我建议你在单独的终端窗口中启动 f3,并使用命名管道(FIFO)在 f2 之间进行通信和 f3。由于通信将通过 FIFO 进行,stdin 仍将指向键盘,您可以输入 f3。

编辑

另一种方法是(尽管我不确定这是否健康),您可以在睡觉前生成一个新线程。在新线程中输入并在输入后终止该新线程。只要没有给出输入,新线程就会运行。在主线程休眠 5 秒后,当主线程唤醒时,使用 pthread_kill 之类的东西强制终止新线程。

【讨论】:

  • 成功了!!非常感谢。在 f1 文件中,我使用 sleep 命令暂停输出 5 秒。我的项目需要我在那段时间接受用户输入。我怎样才能做到这一点。 PS:我的目标是从 f1 文件为 f2 生成随机输入,在 f2 中工作并在 f3 中使用 f2 的结果。在 f1 暂停期间,我想输入 f3 中实际需要的用户输入。如果您能帮助我,我将不胜感激:)
  • 究竟有什么效果?
  • 您需要在 f1 中暂停还是您正在做的事情是为了等待输入?
  • 我在 f1 中读取输入并随后输出到下一个文件中。我需要做的是暂停 f1 给定的秒数。这会将 f1 的输出发送到 f2,然后再发送到 f3。在此暂停期间,我想输入 f3 中所需的字符串。但它必须从 f1 传递。现在面临的问题是,如果我在 f1 中使用 sleep 命令,我的程序仍然会卡在 getline。基本上我想要的是在 getline 函数中添加一个计时器,以便它等待 5 秒的任何输入。如果它没有得到任何输入,它会跳过。
  • 你没有在不同的终端窗口中运行 f3 ?
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多