在公司的项目中,遇到了一个场景,我们需要重新对资源文件合并生成R.java文件,在windows环境下,直接通过命令行来操作很简单,那么每次都需要这样做是不是很麻烦呢,而如果我们使用Python写一个处理命令行的脚本,那么以后我们每次只要调用一下这个脚本就好了。
在Python中,提供了subprocess模块,通过这个模块中的相应API,就可以开启一个子进程来执行相应的脚本来完成这个操作。
可以通过subprocess中的Popen类来处理这个命令。
其中部门源码如下,我们通过构造方法,了解一下其中主要的参数的作用。
import subprocess
class Popen(object):
_child_created = False # Set here since __del__ checks it
def __init__(self, args, bufsize=-1, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,
restore_signals=True, start_new_session=False,
pass_fds=()):
"""Create new Popen instance."""
下面是部分常用的参数的意思:
参数 | 作用 |
---|---|
args | 一般是一个字符串,是要执行的shell命令内容 |
bufsize | 设置缓冲,负数表示系统默认缓冲,0表示无缓冲,正数表示自定义缓冲行数 |
stdin | 程序的标准输入句柄,NONE表示不进行重定向,继承父进程,PIPE表示创建管道 |
stdout | 程序的标准输出句柄,参数意义同上 |
stderr | 程序的标准错误句柄,参数意义同上,特殊,可以设置成STDOUT,表示与标准输出一致 |
shell | 为True时,表示将通过shell来执行 |
cwd | 用来设置当前子进程的目录 |
env | 设置环境变量,为NONE表示继承自父进程的 |
universal_newlines | 将此参数设置为True,Python统一把这些换行符当作’/n’来处理。 |
下面演示通过subprocess的Popen来实现,通过命令行创建一个Android的工程项目。
# -*-coding:utf8-*-
import subprocess
def execute_command(cmd):
print('start executing cmd...')
s = subprocess.Popen(str(cmd), stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
stderrinfo, stdoutinfo = s.communicate()
print('stderrinfo is -------> %s and stdoutinfo is -------> %s' % (stderrinfo, stdoutinfo))
print('finish executing cmd....')
return s.returncode
cmd = r'D:\sdk\tools\android.bat create project --target 8 --name source2apk --path D:\HelloCSDN\ --package com.csdn.lhy --activity MainActivity'
result = execute_command(cmd)
print('result:------>', result)
运行结果如下,可以看到我们在相应的目录下创建这个程序成功了:
C:\Python34\python.exe D:/python_demo/self_study/subprogress_cmd.py
start executing cmd...
stderrinfo is -------> b'Created project directory: D:\\HelloCSDN\nCreated directory D:\\HelloCSDN\\src\\com\\csdn\\lhy\nAdded file D:\\HelloCSDN\\src\\com\\csdn\\lhy\\MainActivity.java\nCreated directory D:\\HelloCSDN\\res\nCreated directory D:\\HelloCSDN\\bin\nCreated directory D:\\HelloCSDN\\libs\nCreated directory D:\\HelloCSDN\\res\\values\nAdded file D:\\HelloCSDN\\res\\values\\strings.xml\nCreated directory D:\\HelloCSDN\\res\\layout\nAdded file D:\\HelloCSDN\\res\\layout\\main.xml\nAdded file D:\\HelloCSDN\\AndroidManifest.xml\nAdded file D:\\HelloCSDN\\build.xml\nAdded file D:\\HelloCSDN\\proguard-project.txt\n' and stdoutinfo is -------> b''
finish executing cmd....
result:------> 0
Process finished with exit code 0