【问题标题】:How to get return value by C program in python如何在python中通过C程序获取返回值
【发布时间】:2020-04-21 18:47:27
【问题描述】:

我有一个 C(on windows) 程序,它有一个返回值的 main 函数。

#include <stdio.h>    
int testData()
{
  int testErr = 0;    
  // ....

  return(testErr);    
}

int main(void) {
  int mainErr = 0;

  mainErr = testData();  
  printf("mainerr = %d", mainErr);

  return mainErr;
}

这个 C 代码可执行文件 myTest.exe 是通过 python 运行的。

self.run_cmd = "myTest.exe "+cmd           # pass agruments to the C exe

    self.testRun = subprocess.run(self.run_cmd,
                                   stdout=subprocess.PIPE, stdin=None, stderr=subprocess.PIPE,
                                   bufsize=0, universal_newlines=True, timeout=100)
    print(">>>>", self.testRun.stdout)
    print(">>>>", self.testRun.stderr)

使用 "print(">>>>", self.testRun.stdout)" 我没有在 python 中获得 C 代码的返回值。 python中如何获取C main返回的返回值。

【问题讨论】:

标签: python c


【解决方案1】:

run 函数返回一个CompletedProcess 对象,该对象具有returncode 属性。

【讨论】:

    【解决方案2】:

    在python中subprocess模块监控命令的返回值(即0表示成功,1表示失败)。由于您从 C 程序返回一些值,因此程序成功退出并返回代码 0。您可以在这里做的是,您可以在 C 程序中使用 exit(1) 以退出代码 1 终止程序,并在其中返回 1。 C程序的退出代码可以用,监控,

    subproc = subprocess.run(<command to execute>, stdout=subprocess.PIPE, stderr=subprocess.PIPE,)
    if (subproc.returncode == 0):
        logger.info('Exited successfully')
    

    另一种方法是将您想要的输出写入一些文件或数据库中,然后从您的 python 代码中读取。

    【讨论】:

    • 返回码将是return'ed from main,当您通过returning from main 终止程序时调用exit 是不必要的
    • 我同意,但对于return 0return 1subproc.returncode 将始终为 0 以成功终止程序。
    【解决方案3】:

    使用子进程获得的返回值将是字节。 运行后:

    self.testRun = subprocess.run(self.run_cmd, stdout=subprocess.PIPE, stdin=None, stderr=subprocess.PIPE,  bufsize=0, universal_newlines=True, timeout=100)
    

    您可以将输出捕获为:

    result = self.testRun.stdout.decode('utf-8')
    

    这个结果是一个字符串,可以进一步使用。

    【讨论】:

    • 感谢 Parv 的建议。由于标准输出已经是 utf 格式,所以不需要解码。 stdout 确实只给出了 C 程序和 python 脚本完成的主要但整个 printf 日志记录的返回值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多