gpt4 book ai didi

python - 在连续运行的 C 和 Python 应用程序之间传递数据

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:20 25 4
gpt4 key购买 nike

有没有办法在连续运行的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 中实现这一点,但统一的单一实现会更好。

最佳答案

你有几个选择

  1. 通过标准输入传递数据并输出到标准输出。

您必须设计一种基于行的格式,从标准输入中读取一行并打印您想要传达给父进程的内容。

看下面的例子

  1. 使用IPC机制进行进程通信

在此我建议使用 zmq。它是跨平台的,并且具有很多功能。

因此,一些 python 代码显示了标准输入/标准输出通信的一般概念

P1( child )

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 它必须自杀。这些进程可以长时间运行。

关于python - 在连续运行的 C 和 Python 应用程序之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com