python脚本能知道C++主函数在Android环境中的返回值吗
Can python script know the return value of C++ main function in the Android environment
有几种方法可以调用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.wait
、Popen.poll
或Popen.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的回答有点不同,而且很有效。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用ndk-build.cmd构建Android.so文件
- Android NDK传感器向事件队列报告奇怪的间隔
- 枚举环境变量的惯用C++14/C++17方法
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- OpenCV Android C++ imwrite not found
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- Android Studio 中带有静态库的原生C++代码
- 如何在 Android Studio 4 中编译 C/C++ 原生代码
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- Android 在编译二进制文件时重建静态库
- 我只想在Android 4.4中使用C++11库
- 无法将标准库导入本机 android 项目中的头文件
- cocos2dx重置或更改setup.py中Android的环境变量
- 无法在Windows 7上设置Android Cocos2d-x开发环境
- Android在100% c++环境下的编程
- python脚本能知道C++主函数在Android环境中的返回值吗
- iostream:在Android NDK环境中没有这样的文件或目录