我有一个python脚本,该脚本与某些网络池接口以读取数据连续320位。这个320位应该转到某个C应用程序,该应用程序不断地从Python脚本中读取这320位,并将它们放入int阵列[8]。老实说,我根本不知道这是否可能是可能的,也要感谢这个问题的起点。
我试图启动您的一些想法,试图通过stdin从Python发送数据到C App:
test.exe:
#include <stdio.h>
int main(void)
{
int ch;
/* read character by character from stdin */
do {
ch = fgetc(stdin);
putchar(ch);
} while (ch != EOF);
return 0;
}
test.py:
def run(self):
while True:
payload = 'some data'
sys.stdout.write(payload)
time.sleep(5)
然后我使用管道开始整个过程:python test.py |test.exe
不幸的是,test.exe方面没有收到的数据,是否应该在stdin上使用此数据ba?
有几种可能的方法。
您可以使用subprocess
模块从Python程序启动C程序。在这种情况下,您可以从Python程序写入C程序的标准输入。这可能是最简单的方法。
import subprocess
network_data = 'data from the network goes here'
p = subprocess.Popen(['the_C_program', 'optional', 'arguments'],
stdin=subprocess.PIPE)
p.stdin.write(network_data)
n.b。如果要多次发送数据,则应不是使用Popen.communicate()
。
另外,您可以使用套接字。但是您必须修改两个程序才能做到这一点。
编辑:J.F Sebatian关于在命令行上使用管道的评论是非常真实的,我忘记了!但是上述技术仍然很有用,因为它是一个较少记住的命令,尤其是如果您想在Python和C程序之间进行双向通信(在这种情况下,您必须将stdout=subprocess.PIPE
添加到subprocess.Popen
调用中,然后将其添加到Python中程序可以从p.stdout
读取)。
已经提到了:
- 插座(要小心框架)
- 消息队列
新建议:
- ctypes(将C代码作为共享对象打开并打电话给它从python带有ctypes)
- Cython/Pyrex(一种类似Python的语言,可以让您漂亮自由混合Python和C数据)
- swig(一种中间语言接口系统)
实际上,插座和消息队列可能是一种更安全的方法。但是它们可能也意味着更多的代码更改。