将正在运行的C代码中的数据链接到正在运行的Python代码

时间:2016-03-06 16:20:44

标签: python c import pipe

我在C代码中接收数据,目前我唯一能做的就是在屏幕上打印数据。我想知道,如果有可能不是仅仅在屏幕上打印数据,是否可以将数据发送到能够进一步处理数据的正在运行的Python代码?数据采用数组形式。将在屏幕上打印数据的设备将运行Python代码。

我这样做是为了避免将数据保存在文件中,然后从我的python脚本访问该文件,这将增加我的时间相关系统的延迟。

C代码在低处理设备上运行,该设备只能接收数据而无需任何处理。

(编辑)我的意思的证明包括在内:

C方:

// code that receives the data periodically as an array 
// when received do 
printf(" x = %d y = %d z = %d ", data[0],data[1],data[2]); 
// what I am looking for is something like this 
sendtoPy("filename.py",data)
// repeat 

Python方面:

# this code just sits to wait for anything coming from C 
# wait for any code to be received from datafromCexample.c
def waitforC("datafromCexample.c",data):
      print "data has been received"
      # process the data received into a list
      # further processing 
waitforC(data)

当然这只是演示的原始代码。如果我在演示中犯了错误,请教我并纠正我,我只是想学习。如果没有,您能否包括可以在这种情况下使用的替代品?

谢谢。

3 个答案:

答案 0 :(得分:2)

如果C程序和Python程序/脚本可以在同一设备上运行,那么您有几个选择:

  • 让C代码在标准输出上输出数据(这可能就是它已经在做的),将它传递给Python程序并让Python程序读入标准输入。
  • 让C代码在标准输出上输出数据并从Python代码调用C程序(例如使用subprocess.check_output,处理生成的输出。
  • 在C代码中,有一个函数将按块返回数据块(每个调用一个块,其中“块”是一个可以轻松生成和处理的大小的数量)。使用Cyton(请参阅Tony's answer)或CFFI或任何other available ways来重复调用Python以获取要处理的数据。
  • 编写一个Python脚本,可以使用单个数据块调用并处理它。使用系统调用重新调用C脚本中的所有数据块来重复调用Python脚本。
  • 使用Cyton从C调用python函数。

根据操作系统的不同,您可以使用命名管道,套接字,总线消息等等来获得更好的功能,但上面的选项可能已经足够可供选择,并且应该足以满足大多数用例。选择哪一个取决于您的数据的性质以及它的所需处理,以及一些非功能性要求(例如,如果其中一个过程停止,那么......)因此无法回答

在对此答案的评论中,you inquire

  

我希望选择第一个选项[...]。如果你能推荐一个可以很好地使用数组的库或程序,我将不胜感激。

and

  

对于C方面,我将需要通过它的库,我将数据传递给python代码。在Python方面,我想我将需要使用多线程,这将允许我永远运行(预测任何传入的数据)2接收来自C代码的传入数据,因此一个库将能够这样做

管道的美妙之处在于,所涉及的流程在大多数编程语言中都不需要任何特殊的库。这些过程只是做了几乎所有通用编程语言允许的(或多或少)简单方法:从标准输入读取和/或写入标准输出。这也是命令行应用程序在读取您在键盘上键入的内容和/或将文本打印到(今天经常是虚拟的)终端(例如文本控制台)时所做的事情。

将一个进程的输出转发到另一个进程的输入(就像用户正在读取第一个进程打印的内容并将其输入到第二个进程中)是操作系统的任务,因此进程不必是关心这一点。第一个过程只需要输出第二个过程可以理解的格式。

例如,unix命令ls将列出当前工作目录中的文件和目录。让我们假设它每行打印一个名字。 unix命令shuf从标准输入读取行,直到它检测到其中的文件结束符,然后以随机顺序打印它们。 (它洗了他们。)

您可以在shell中调用shuf(例如shbash)并输入Hello World! [输入] I like shuffled text. [输入] {{1 } [Enter] Do you, too? [Enter] [Ctrl + d],可能会得到如下输出:

No? What a pity.

如果要列出当前工作目录中的文件和目录,但使用的顺序与Do you, too? Hello World! No? What a pity. I like shuffled text. 返回的顺序不同,则可以将ls的输出通过ls。 。例如。在shufsh

bash

将获取ls | shuf 的输出并将其转发到ls,如果它是手动输入的话。 (只比你输入的快得多。)

因此,如果您的C程序在终端上产生机器可解析的输出(可能已经是这种情况;您可能希望在您的问题中包含其当前终端输出的示例。),您可以将其转发到您的python有类似

的程序
shuf

然后你的python程序只需要read from standard input并处理你想要它的内容。读取标准输入的大多数直接方法将遍历所有接收到的行,直到文件结束发生或者它们收到终止进程的信号,因此保持python脚本永久运行不应该太难。 (除非您还关心在意外终止时自动重启,例如由于运行时错误。)

答案 1 :(得分:1)

您可以考虑从python代码调用C函数,请阅读此示例https://csl.name/post/c-functions-python/

答案 2 :(得分:1)

如果您关心系统的时间效率,我会使用Cython来包装您拥有的程序的c部分。您可以阅读here的完整教程。您也可以使用Cython来加速代码的python部分。