python脚本能否知道Android环境中C ++主函数的返回值

时间:2015-06-22 16:01:03

标签: python c++

有几种方法可以调用C ++可执行程序。例如,我们可以使用

 def run_exe_return_code(run_cmd):
        process=subprocess.Popen(run_cmd,stdout=subprocess.PIPE,shell=True)
        (output,err)=process.communicate()
        exit_code = process.wait()
        print output
        print err
        print exit_code
        return exit_code

处理C ++可执行程序:run_exe_return_code('abc')abc由以下C ++代码创建:

int main()
{
      return 1;
}

在上面的代码中,程序的返回值是1,如果我们在Linux中运行这个Python脚本,我们总能看到Python脚本的返回值是1.但是,在Android环境中它似乎是返回上面的python脚本中的退出代码是0,表示成功。有没有一个解决方案,Python脚本可以知道Android环境中main函数的返回值?

顺便说一句,在android环境中,我使用adb shell abc代替abc来运行该程序。

5 个答案:

答案 0 :(得分:4)

对于您的Android问题,您可以使用{<3}}“传播程序退出状态而不是始终退出状态0 ”(首选),或使用此fb-adb(hackish ......不推荐用于生产用途):

def run_exe_return_code(run_cmd):
        process=subprocess.Popen(run_cmd + '; echo $?',stdout=subprocess.PIPE,shell=True)
        (output,err)=process.communicate()
        exit_code = process.wait()
        print output
        print err
        print exit_code
        return exit_code

请注意,最后一个进程的代码是echo - ed,因此请从输出中获取,而不是从adb的exit_code获取。

$?返回最后一个退出代码。所以打印它允许你从python访问它。

关于你原来的问题:

我无法重现这一点。这是一个简单的例子:

.c档案的内容:

reut@reut-VirtualBox:~/pyh$ cat c.c 
int main() {
    return 1;
}

编译(默认为a.out ...):

reut@reut-VirtualBox:~/pyh$ gcc c.c

.py档案的内容:

reut@reut-VirtualBox:~/pyh$ cat tstc.py 
#!/usr/bin/env python

import subprocess

def run_exe_return_code(run_cmd):
    process=subprocess.Popen(run_cmd,stdout=subprocess.PIPE)
    (output,err)=process.communicate()
    exit_code = process.wait()
    print output
    print err
    print exit_code

run_exe_return_code('./a.out')

测试:

reut@reut-VirtualBox:~/pyh$ ./tstc.py 

None
1

exit_code符合预期1

请注意,返回值始终是整数。您可能希望使用workaround获得输出:

  

使用参数运行命令并将其输出作为字节字符串返回。

示例:

>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!\n'

注意:如果返回值为1,表示错误,则会引发subprocess.check_output异常(这通常是一件好事,因为您可以回复它)。

答案 1 :(得分:1)

我认为您可以尝试使用command.getstatusoutput,如下所示:

import commands

status, result = commands.getstatusoutput(run_cmd)

print result

答案 2 :(得分:1)

是的,你可以! 您提交的代码的简单版本是:

import subprocess
exit_code=subprocess.call('./a.out')`
print exit_code

使用./a.out编译的程序:

int main(){
    return 3;
}

测试:

python testRun.py
3

啊,请注意,shell = True可能会造成安全隐患。 https://docs.python.org/2/library/subprocess.html

def run_exe_return_code(run_cmd):
    process=subprocess.Popen(run_cmd,stdout=subprocess.PIPE,shell=True)

答案 3 :(得分:0)

请参阅此答案:https://stackoverflow.com/a/5631819/902846。根据您的示例进行调整,它看起来像这样:

def run_exe_return_code(run_cmd):
    process = subprocess.Popen(run_cmd, stdout=subprocess.PIPE, shell=True)
    (output, err) = process.communicate()
    process.wait()
    print output
    print err
    print process.returncode
    return process.returncode

简短摘要是,您可以根据需要使用Popen.waitPopen.pollPopen.communicate来更新返回代码,然后使用{{1}检查返回代码之后。

另请参阅Popen的Python文档:https://docs.python.org/2/library/subprocess.html

答案 4 :(得分:0)

def run_exe_android_return_code(run_cmd):
     #adb shell '{your command here} > /dev/null 2>&1; echo $?'
     process=subprocess.Popen(run_cmd,stdout=subprocess.PIPE,shell=True)
     (output,err)=process.communicate()
     pos1   = output.rfind('\n')
     output = output[:pos1-1]
     pos2   = output.rfind('\n')
     output = output[pos2+1:]
     print output
     return output

这是用于检查在Android上运行可执行文件的返回值的Python脚本。

def run_android_executable(full_path,executable):
    executable = full_path+'/'+executable
    run_cmd = 'adb shell \'LD_LIBRARY_PATH='+full_path+':$LD_LIBRARY_PATH '+executable+'; echo $?\''
    print run_cmd
    error_code=run_exe_android_return_code(run_cmd)
    print 'the error code is'
    print error_code
    if(error_code=='1'):
        print 'the executable returns error'
    else:
        print 'the exectuable runs smoothly'

这是用于运行可执行文件的secript。它与Reut Sharabani的答案略有不同,而且有效。