微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android-无法从python内调用bash

我正在尝试使用python来帮助围绕Android构建系统中的增量构建功能进行一些自动化.通常,从给定目录中,我将执行以下命令来构建该目录和子目录中的内容

mm -j8

这类似于“ make”命令,只是它是增量构建,并在名为envsetup.sh的bash文件中定义为函数.什么并不重要,只要知道它是在文件系统中某个位置的bash脚本中定义的函数即可.要执行此操作,我还可以执行以下操作:

bash -c ". /path/to/envsetup.sh; mm -j8"

这种调用方法对从python调用函数很重要.我遵循的解决方here展示了如何从python调用bash脚本中的函数.我在一个简单的脚本中使用了此方法,从理论上讲,该脚本应该吐出STDOUT和STDERR来执行命令:

import subprocess

command = ['bash', '-c', '. /path/to/envsetup.sh; mm -j8']
(stdout, stderr) = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()

print 'stdout: ' + stdout
print 'stderr: ' + stderr

但是,对Popen的调用永远不会返回.我做错了什么让bash正确执行命令,但是执行命令时Python挂起?

解决方法:

tl;医生:

您的问题是使用shell = True.将其设置为shell = False即可.

设置此选项后,python只会运行命令数组的第一个元素,即bash作为shell脚本.因此,当前,python正在启动自己的外壳程序,以运行命令(bash).它将不带任何参数运行bash,然后bash将等待输入,从而阻止python脚本.

shell = True设置适用于将Shell脚本作为单个字符串传递的用例.当您像上面所做的那样,在将外壳及其参数明确指定为要调用的过程时,应设置shell = False.

>>> import subprocess
>>> subprocess.Popen(['bash', 'whatever'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()

这是当我运行上面的过程树的样子:

  \_ python
      \_ /bin/sh -c bash whatever
          \_ bash

实际上传入的是什么,但这是sh的参数,而不是内部bash的参数,因此正在运行的命令实际上是[‘/ bin / sh’,’-c’,’bash’,’whatever’ ],与[‘/ bin / sh’,’-c’,’bash what’]完全不同

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐