Python与C语言popen函数操作外部程序输入输出的实操示例
介绍如何在Python和C语言中使用popen函数启动外部命令并建立输入输出管道。通过准备测试程序,演示如何利用r模式获取程序标准输出,以及利用w模式向被调用程序写入数据,附带完整代码与运行结果对照。
目标与原理概述
popen函数用于创建一个管道并派生新进程执行指定命令。在标准C库和Python的os模块中均可调用。通过控制打开模式(r或w),可实现单向的数据流交换:r模式允许父进程读取子进程的标准输出;w模式允许父进程向子进程的标准输入写入数据。
准备测试环境
第1步:编译基础测试程序
目的:创建两个独立的测试可执行文件,分别用于验证读写逻辑。
// outputTest.c
#include <stdio.h>
int main(){
printf("Just a test ! \n");
return 0;
}
// inputTest.c
#include <stdio.h>
int main(){
char buf[1024] = {0};
scanf("%s",buf);
printf("your input : %s\n",buf);
return 0;
}
编译命令:gcc outputTest.c -o outputTest 和 gcc inputTest.c -o inputTest。请确保当前工作目录下已生成这两个可执行文件,并在后续操作中保持它们未被占用。
C语言中的popen操作
第2步:获取外部程序输出(读取模式)
目的:启动outputTest进程并通过管道读取其标准输出至缓冲区。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
FILE *read_fp;
char buffer[BUFSIZ + 1];
int chars_read;
memset(buffer,'\0',sizeof(buffer));
read_fp = popen("./outputTest","r");
if(read_fp != NULL){
chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp);
if(chars_read > 0)
printf("Output was : \n%s\nDone\n",buffer);
pclose(read_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}

第3步:向外部程序传递参数(写入模式)
目的:将指定数据写入inputTest进程的标准输入流,并触发其回显逻辑。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
FILE *write_fp;
char buffer[BUFSIZ + 1];
sprintf(buffer,"Once...\n");
write_fp = popen("./inputTest","w");
if(write_fp != NULL){
fwrite(buffer,sizeof(char),strlen(buffer),write_fp);
pclose(write_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}

Python中的popen操作
第4步:使用os.popen读取输出
目的:在Python环境中直接调用系统接口获取子进程输出。
import os
var = os.popen('./outputTest').read()
print(var)

第5步:使用os.popen写入输入
目的:通过Python脚本直接向目标进程发送输入数据。
import os
os.popen('./inputTest','w').write("test")

完成判断与注意事项
完成判断:终端窗口按预期输出子进程的打印内容或回显结果,且程序正常退出、无段错误或管道阻塞,即说明管道交互配置正确。务必在操作完成后调用pclose()或确保文件句柄释放,以防止僵尸进程或文件描述符泄漏。
以上就是Python与C语言使用popen函数进行进程通信的详细内容,更多关于编程语言基础与系统级交互的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









