Python3.4.3(py)使用subprocess的Popen执行系统命令行并取返回值

来源:赵克立博客 分类: Python 标签:命令行Python发布时间:2016-06-13 22:32:16最后更新:2019-11-09 15:23:40浏览:5638
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2019-11-09 15:23:40
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

第一种

这种如果可以用就不用使用下第二种啦

import os
def runCmd(cmd):
    result = os.popen(cmd)
    res = result.read()
    str = ''
    for line in res.splitlines():
        str = str + line
    return str

第二种

首先看一个调用控制台php.exe输出版本号的命令,代码如下

import subprocess,os
globalStartupInfo = subprocess.STARTUPINFO()
globalStartupInfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
cmd=['php.exe','-v']
def runCmd(cmd):
    print('running:%s' % cmd)
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=os.getcwd(),  shell=True, startupinfo=globalStartupInfo)
    out, err = p.communicate()
    if p.returncode != 0:
        print("Non zero exit code:%s executing: %s" % (p.returncode, cmd))
    return out.decode()
print(runCmd(cmd))

运行后输出如下图:

QQ截图20160613223127.png


写成一个函数使用


先看下这个类的参数

class subprocess.Popen( 
            args, 
      bufsize=0, 
      executable=None,
      stdin=None,      
      stdout=None, 
      stderr=None, 
      preexec_fn=None, 
      close_fds=False, 
      shell=False, 
      cwd=None, 
      env=None, 
      universal_newlines=False, 
      startupinfo=None, 
      creationflags=0)

注意到cmd这个命令可以用一个列表把参数分开写如下:

cmd=['run.exe','-path=c:/1.jpg','-format=jpg','-yasuo=1']

如上所示可以添加任意的参数,传进去后会自动组合成

run.exe   -path=c:/1.jpg  -format=jpg  -yasuo=1


args

字符串或者列表

bufsize

0 无缓冲
1 行缓冲
其他正值 缓冲区大小
负值 采用默认系统缓冲(一般是全缓冲)

executable

一般不用吧,args字符串或列表第一项表示程序名

stdin
stdout
stderr

None 没有任何重定向,继承父进程
PIPE 创建管道
文件对象
文件描述符(整数)
stderr 还可以设置为 STDOUT

preexec_fn

钩子函数, 在fork和exec之间执行。(unix)

close_fds

unix 下执行新进程前是否关闭0/1/2之外的文件
windows下不继承还是继承父进程的文件描述符

shell

为真的话
unix下相当于args前面添加了 "/bin/sh“ ”-c”
window下,相当于添加"cmd.exe /c"

cwd

设置工作目录

env

设置环境变量

universal_newlines

各种换行符统一处理成 '\n'

startupinfo

window下传递给CreateProcess的结构体

creationflags

windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口

Popen执行后返回的对象还有几个方法可以使用


poll()

检查是否结束,设置返回值

wait()

等待结束,设置返回值

communicate()

参数是标准输入,返回标准输出和标准出错

send_signal()

发送信号 (主要在unix下有用)

terminate()

终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess()

kill()

杀死进程(unix对应SIGKILL信号),windows下同上

stdin
stdout
stderr

参数中指定PIPE时,有用

pid

进程id

returncode

进程返回值



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python