C语言与python获取命令行输出

本文介绍了一种在C语言中通过popen函数执行系统命令的方法,并对比了Python中执行相同任务的不同方式,包括os模块的system方法及popen结合readlines方法。
部署运行你感兴趣的模型镜像

这个是我在网上看到的代码,自己编译运行了一下,可以通过

#include<stdlib.h>
#include<stdio.h>


void execSysCommand(char *command/* in */,char* res/* out */)
{
    char buff[128] = {0};
    FILE *file = NULL;
    file = popen(command,"r");   //打开一个管道流判断是否可以使用

    if(file == NULL)
    {
       return;
    }
    while(!feof(file))
    {
       if(fgets(buff,128,file))
       {
          strcat(res,buff);
       }

    }
    pclose(file);
}

int main(int argc,char *argv[])
{
   char res[1024] ={0};
   execSysCommand("pwd",res);
   printf("%s",res);
   return 0;
}

Python中也有一些可以这样运行的代码
我们可以使用

os.system('pwd')//打印当前路径

运行结果:第一个中我们执行会有状态码
这里写图片描述
这里写图片描述

利用管道的方式

os.popen('pwd').readlines() //打开管道执行pwd命令

这里写图片描述
我们也可以使用命令

commands.getoutput('pwd')  //命令获取输出

这里写图片描述

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### C语言中调用Python接口的方法 为了使C程序能够调用Python中的API或函数,需遵循特定的过程。这涉及引入必要的头文件并管理Python解释器的状态。 #### 初始化终止Python解释器 在任何操作之前,必须通过`Py_Initialize()`初始化Python解释器[^2]。此过程设置环境以便后续可以安全地执行Python代码片段或是导入模块以及调用其中定义的功能。当不再需要这些功能时,则应调用`Py_Finalize()`来清理资源并关闭解释器实例。 #### 执行简单Python语句 对于想要直接运行一些基本的Python命令的情况,可利用`PyRun_SimpleString()`方法传入待执行的字符串形式的指令。例如: ```c #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); // Initialize the Python interpreter. const char* python_code = "print('funny')"; PyRun_SimpleString(python_code); // Execute simple Python code. Py_Finalize(); // Finalize and clean up resources used by the Python interpreter. return 0; } ``` 上述例子展示了怎样创建一个最基础的应用场景,在这里只做了一件事情——即输出单词"funny"。 #### 调用无参数的Python函数 如果目标是从C侧调用位于某个已加载模块内的具体函数,并且该函数不接受外部输入的话,那么可以通过构建相应的PyObject结构体指针指向所需的目标函数来进行间接调用。下面给出的是针对这种情况下的简化版实现方式: ```c // Assume we have a Python script named 'mymodule.py' with an unparameterized function called `my_function`. const char* moduleName = "mymodule"; const char* functionName = "my_function"; PyObject* pName = PyUnicode_DecodeFSDefault(moduleName); PyObject* pModule = PyImport_Import(pName); if (pModule != NULL){ PyObject* pFunc = PyObject_GetAttrString(pModule, functionName); if (pFunc && PyCallable_Check(pFunc)){ PyObject_CallObject(pFunc, NULL); // Call without arguments. } } Py_XDECREF(pFunc); Py_DECREF(pName); Py_Finalize(); ``` 这段代码首先尝试获取指定名称的模块对象(`mymodule`)及其内部名为`my_function`的方法;之后验证后者确实存在并且是可以被调用的对象后便立即对其发起一次不含实参列表的调用请求。 #### 处理带参数情况 对于带有参数的情形,通常会涉及到更复杂的类型转换逻辑,因为来自不同编程范式的变量之间可能存在兼容性差异。此时可能需要用到像`Py_BuildValue()`这样的辅助工具帮助完成数据类型的适配工作[^4]。 ```c int result; result = PyCall("example", "add_numbers", "(ii)", num1, num2); printf("Result from add_numbers is %d\n", result); ``` 在这个假设的例子中,假设有这样一个叫做`example`的Python模块里面有一个接收两个整型数值作为输入参数并返回它们之和的`add_numbers`函数。这里的`PyCall`是一个自定义封装好的宏/函数用来简化跨语言边界的数据交换流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值