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

时间:2012-02-24 03:10:45

标签: python c input

我有一个用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等)。

3 个答案:

答案 0 :(得分:3)

您应该做的第一件事是开始使用Python's subprocess module,而不是os.system。一旦你完成了,那么你可以改变它,这样C程序的stdin就是你可以用Python写的东西,而不是继承Python脚本的stdin

之后,您可以让Python发送C程序可以解释的数据。例如,您可能希望使用一堆JSON块,每行一个,如Twitter's streaming API 1 ; Python脚本生成一个请求字典,用json.dump序列化它,然后写一个换行符。 C程序读取一行,解析JSON并处理请求。

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

答案 1 :(得分:3)

icktoofayJasonFruit提出了体面的方法;我打算建议将这两个程序进一步分离。

如果您将C程序编写为服务器来侦听请求并回复TCP套接字上的答案,您可以更轻松地更改客户端,使其支持多个并发客户端,执行近乎无缝的升级客户端或服务器而无需修改其他客户端或服务器,或者您可以将C程序移动到功能更强大的硬件,而无需进行稍微修改配置。

打开侦听套接字并接受连接后,程序的其余部分可以继续,就像您只是通过标准输入和标准输出进行交互一样。这样做效果很好,但您可能更喜欢以某种标准格式对数据进行编码,例如JSONASN.1,这可以节省一些手动字符串处理。

答案 2 :(得分:2)

你能用pexpect做点什么吗?它允许您为命令行程序提供输入,在继续之前等待来自它的指定提示。它还允许您读取介入的输出,以便您可以根据需要对其进行响应。

如果您使用的是Windows(正如我从您的评论中注明的那样),您可以尝试使用类似的winpexpect