有几种方法可以调用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
来运行该程序。
答案 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.wait
,Popen.poll
或Popen.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的答案略有不同,而且有效。