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

Can python script know the return value of C++ main function in the Android environment

本文关键字:环境 Android 返回值 函数 本能 脚本 C++ python      更新时间:2023-10-16

有几种方法可以调用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环境中知道主函数的返回值?

顺便说一句,在android环境中,我使用adb shell abc而不是abc来运行程序。

对于您的android问题,您可以使用fb-adb,它"传播程序退出状态,而不是总是以状态0退出"(首选),或者使用此解决方法(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

CCD_ 12如预期的那样是CCD_。

请注意,返回值始终是一个整数。您可能想要使用subprocess.check_output:可以获得的输出

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

示例:

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

注意:如果返回值是1,表示出现错误,则会引发CalledProcessError异常(这通常是一件好事,因为您可以对此做出响应)。

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

import commands

status, result = commands.getstatusoutput(run_cmd)

print result

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

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)

请参阅以下答案: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来更新返回代码,然后使用Popen.returncode检查返回代码。

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

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

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

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'

这是用于运行可执行文件的脚本。这与Reut Sharabani的回答有点不同,而且很有效。