Python之使用subprocess处理shell命令

  • Python学习之使用subprocess处理shell命令
    • 前言
    • subprocess
    • 实例代码

Python学习之使用subprocess处理shell命令

前言

在公司的项目中,遇到了一个场景,我们需要重新对资源文件合并生成R.java文件,在windows环境下,直接通过命令行来操作很简单,那么每次都需要这样做是不是很麻烦呢,而如果我们使用Python写一个处理命令行的脚本,那么以后我们每次只要调用一下这个脚本就好了。

subprocess

在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

你可能感兴趣的:(Python)