动态python用户输入到一个单独的C程序



我有一个用Tkinter编写的python GUI界面。该程序的要点是设置许多不同的变量,以便对高光谱图像(地理资料)进行最终计算。现在,已经开发了一些进一步的规范,其中用户希望能够主动输入要平滑的像素组的一些参数。这些信息将在Python GUI中输入,处理图像修改的C程序需要这些信息作为输入。由于图像可能是巨大的,我想尽量避免总是用之类的调用重新运行C程序(涉及内存分配、读取巨大文件等)

os.system(./my_C_Program param1 param2 param3....)

我更希望有一个系统,一旦我调用了my_C_Program,它就可以在将所有资源加载到内存后处于等待状态。我想我想要的是涉及getchar()的东西,但我不知道如何从python获得输出以转到my_C_Program。我在SO上看到过一些类似的问题,但我无法确定这些场景对我的具体帮助。

如果getchar()是答案,有人能解释一下stdout是如何在多个终端打开的情况下工作的吗?

同时,我正在努力让这个程序在linux/mac/windows之间轻松地保持多平台。

总之,我想要以下功能:

  1. 用户从python GUI中选择某些输入
  2. 该输入成为C程序的输入
  3. 该C程序可以处理更多的输入,而不必从一开始就再次运行(避免文件I/O等)

您应该做的第一件事可能是开始使用Python的subprocess模块,而不是os.system。完成后,您可以更改它,使C程序的stdin可以用Python编写,而不是继承Python脚本的stdin

之后,您可以让Python发送C程序可以解释的数据。例如,您可能希望使用一组JSON块,每行一个,如Twitter的流式API1;Python脚本生成一个请求字典,用json.dump对其进行序列化,然后编写一行换行符。C程序读取一行,解析JSON,并处理请求。

1阅读文档后,它们的实现看起来有点复杂。你可以采用他们的做法,也可以像我描述的那样。

icktoofay和JasonFruit提出了一些不错的方法;我将建议进一步将这两个程序解耦。

如果您将C程序编写为服务器,该服务器在TCP套接字上侦听请求并用答案进行答复,您可以更容易地更改客户端,使其支持多个同时的客户端,对客户端或服务器执行近乎无缝的升级,而不必修改其他客户端或服务器,或者,您可以将C程序移动到更强大的硬件上,而不需要做更多的配置修改。

一旦您打开了一个侦听套接字并接受了连接,程序的其余部分就可以继续运行,就好像您只是在通过标准输入和标准输出进行交互一样。这已经足够好了,但您可能更喜欢用一些标准化格式(如JSON或ASN.1)对数据进行编码,这可以节省一些手动字符串处理。

你能用pexpect做点什么吗?它允许您向命令行程序提供输入,等待指定的提示后再继续。它还允许您读取干预输出,以便您可以根据需要对此做出响应。

如果你在Windows上(正如我从你的评论中注意到的那样),你可以尝试类似的winpexpect。

最新更新