在连续运行的 C 和 Python 应用程序之间传递数据
Posted
技术标签:
【中文标题】在连续运行的 C 和 Python 应用程序之间传递数据【英文标题】:Communicate data between C and Python apps running continuously 【发布时间】:2015-05-14 16:03:43 【问题描述】:有没有办法在连续运行的 C 程序和连续运行的 Python 程序之间传递数据? C 程序首先启动很重要。
到目前为止,我有(对于 C 端):
void run_cmd(char *cmd[])
int parentID = getpid();
char str[1*sizeof(double)];
sprintf(str, "%d", parentID);
char* name_with_extension;
name_with_extension = malloc(2+strlen(cmd[1])+1*sizeof(int)+1);
strcat(name_with_extension, cmd[1]);
strcat(name_with_extension, " ");
strcat(name_with_extension, str);
pid_t pid;
char *argv[] = "sh", "-c", name_with_extension, NULL;
int status;
//printf("Run command: %s\n", cmd);
status = posix_spawn(&pid, "/bin/sh", NULL, NULL, argv, environ);
if (status == 0)
//printf("Child pid: %i\n", pid);
//printf("My process ID : %d\n", getpid());
//if (waitpid(pid, &status, 0) != -1)
// printf("Child exited with status %i\n", status);
// else
// perror("waitpid");
//
//part below is not tested and will probably not work
int myout[2];
pipe(myout);
int status;
int ch;
do
if (read(myout[0], &ch, 1)>0)
write(1, &ch, 1);
waitpid(pid, &status, WNOHANG);
while (!WIFEXITED(status) && !WIFSIGNALED(status));
对于 Python,我现在只能使用以下方法获取参数列表:
print 'Arguments ', str(sys.argv)
据我了解,subprocess.Popen 不是一个可行的方法,因为它会创建一个我不想要的新进程。
在 Python 中嵌入(或反向)C 不是一种选择,因为代码太大。
我认为使用进程 IDs 和可能的 sockets 之间的通信数据,但不确定并需要一些建议.
目标是在 Windows 中实现这一点,但统一的单一实现会更好。
【问题讨论】:
您的代码中有 未定义的行为,malloc
函数不会初始化它分配的内存,因此当您调用 strcat
时,它会查找字符串终止符可能不在分配的内存中,您可能会超出分配的内存范围。
@JoachimPileborg 该代码仅用于测试。如果重要,程序运行如下:./c_prog ./py_prog,其中py_prog在启动时接收父端口号
@MocialovBoris 修复你已经知道错误的地方,(因为 Joachim 发布的内容),否则它可能会搞砸你未来的调试。至于“有没有办法在连续运行的C程序和连续运行的Python程序之间传递数据?”,那么当然有。
@MartinJames 哦,我错过了这样的答案
另一个选项是基于文件系统的 FIFO 队列。
【参考方案1】:
你有几个选择
-
通过标准输入传递数据并输出到标准输出。
您必须设计一种基于行的格式,从标准输入读取一行并打印您想要与父进程通信的内容。
请看下面的例子
-
使用 IPC 机制进行进程通信
在此我建议使用 zmq。它是跨平台的,并且有很多功能。
因此,python 中的一些代码显示了标准输入/标准输出通信的一般概念
P1(孩子)
import sys
import time
i=0
while True:
line = sys.stdin.readline().strip()
if not line:
time.sleep(0.5)
if line=="ping":
sys.stdout.write("pong\n")
sys.stdout.flush()
i+= 1
if i > 10:
sys.stdout.write("exit\n")
sys.stdout.flush()
P2(主人)
import subprocess
p = subprocess.Popen(['python', './p1.py'],stdout=subprocess.PIPE, stdin=subprocess.PIPE)
while True:
p.stdin.write("ping\n")
p.stdin.flush()
ret = p.stdout.readline().strip()
print ret
if ret=='exit':
exit(0)
P2 开始 P1,他们打了 10 次乒乓球,然后 p1 通知 p2 它必须杀死自己。这些进程可能会长时间运行。
【讨论】:
标准输入和标准输出的意思是这样的:“ifconfig | grep en0”,对吧?然后我不知道如何将其扩展到连续运行的程序。 @MocialovBoris,我稍后会发布一个示例 @MocialovBoris 两者都在 python 中,因为我不确定 windows 的做事方式,但在 c 中会是类似的。 感谢您的建议,但我发现 FIFO 队列简单明了以上是关于在连续运行的 C 和 Python 应用程序之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章