• Python用subprocess的Popen来调用系统命令


    当我们须要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。可是这两个命令过于简单,不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出,推断该命令的执行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完毕我们须要的操作。在这里对Popen予以简介。

    以下是一个非常easy的样例,来自Python的官网教程:http://docs.python.org/library/subprocess.html

     

    >>> import shlex, subprocess
    >>> command_line = raw_input()
    /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
    >>> args = shlex.split(command_line)
    >>> print args
    ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
    >>> p = subprocess.Popen(args) # Success!

    Popen它的构造函数例如以下:

     

    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)

    參数args能够是字符串或者序列类型(如:list,元组),用于指定进程的可运行文件及其參数。假设是序列类型,第一个元素一般是可运行文件的路 径。我们也能够显式的使用executeable參数来指定可运行文件的路径。在windows操作系统上,Popen通过调用 CreateProcess()来创建子进程,CreateProcess接收一个字符串參数,假设args是序列类型,系统将会通过 list2cmdline()函数将序列类型转换为字符串。

    參数bufsize:指定缓冲。我到如今还不清楚这个參数的详细含义,望各个大牛指点。


    參数executable用于指定可执行程序。普通情况下我们通过args參数来设置所要执行的程序。假设将參数shell设为 True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。


    參数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们能够是PIPE,文件描写叙述符或文件对象,也能够设置为None,表示从父进程继承。


    參数preexec_fn仅仅在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程执行之前被调用。


    參数Close_sfs:在windows平台下,假设close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管 道。我们不能将close_fds设置为True同一时候重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。


    假设參数shell设为true,程序将通过shell来运行。


    參数cwd用于设置子进程的当前文件夹。


    參数env是字典类型,用于指定子进程的环境变量。假设env = None,子进程的环境变量将从父进程中继承。


    參数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用’/r/n’表示换,而Linux下用 ‘/n’。假设将此參数设置为True,Python统一把这些换行符当作’/n’来处理。


    參数startupinfo与createionflags仅仅在windows下用效,它们将被传递给底层的CreateProcess()函数,用 于设置子进程的一些属性,如:主窗体的外观,进程的优先级等等。

    subprocess.PIPE
    在创建Popen对象时,subprocess.PIPE能够初始化stdin, stdout或stderr參数。表示与子进程通信的标准流。

    subprocess.STDOUT
    创建Popen对象时,用于初始化stderr參数,表示将错误通过标准输出流输出。

    Popen的方法:

    Popen.poll() 
    用于检查子进程是否已经结束。设置并返回returncode属性。

    Popen.wait() 
    等待子进程结束。设置并返回returncode属性。

    Popen.communicate(input=None)
    与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选參数input指定发送到子进程的參数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:假设希望通过进程的stdin向其发送数据,在创建Popen对象的时候,參数stdin必须被设置为PIPE。相同,如 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。

    Popen.send_signal(signal) 
    向子进程发送信号。

    Popen.terminate()
    停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。

    Popen.kill()
    杀死子进程。

    Popen.stdin 
    假设在创建Popen对象是,參数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。

    Popen.stdout 
    假设在创建Popen对象是,參数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

    Popen.stderr 
    假设在创建Popen对象是,參数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

    Popen.pid 
    获取子进程的进程ID。

    Popen.returncode 
    获取进程的返回值。假设进程还没有结束,返回None。

    以下是一个很easy的样例,来演示supprocess模块怎样与一个控件台应用程序进行交 互。

    import subprocess   

    p = subprocess.Popen(“app2.exe”, stdin = subprocess.PIPE, /   
    stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)   

    p.stdin.write(’3/n’)   
    p.stdin.write(’4/n’)   
    print p.stdout.read()   

    #—- 结果 —-   
    input x:    
    input y:    
    3 + 4 = 7 

    app2.exe也是一个很easy的控制台程序,它从界面上接收两个数值,运行加操作,并将结 果打印到控制台上。代码例如以下:

    #include <iostream>   
    using namespace std;   

    int main(int argc, const char *artv[])   
    {   
    int x, y;   
    cout << “input x: ” << endl;   
    cin >> x;   
    cout << “input y: ” << endl;   
    cin >> y;   
    cout << x << ” + ” << y << ” = ” << x + y << endl;   

    return 0;   

     

    supprocess模块提供了一些函数,方便我们用于创建进程。

    subprocess.call(*popenargs, **kwargs)
    执行命令。该函数将一直等待到子进程执行结束,并返回进程的returncode。文章一開始的样例就演示了call函数。假设子进程不须要进行交 互,就能够使用该函数来创建。

    subprocess.check_call(*popenargs, **kwargs) 
    与subprocess.call(*popenargs, **kwargs)功能一样,仅仅是假设子进程返回的returncode不为0的话,将触发CalledProcessError异常。在异常对象中,包 括进程的returncode信息。

    subprocess模块的内容就这么多。在Python手冊中,还介绍了怎样使用 subprocess来替换一些老的模块,老的函数的样例。赶兴趣的朋友能够看一下。

    參考文档:

    subprocess — Subprocess management

    PyMoTW:subprocess

    http://hi.baidu.com/kobeantoni/blog/item/a034bce9d0e01bdfd539c9a4.html

  • 相关阅读:
    golang 实现生产者消费者模式(转)
    ssh设置免密登录后登录仍需密码可能的原因,以及 ssh 出问题或的调试方法
    http 请求 Cros 跨域问题记录(转)
    问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(转)
    Git撤销本地commit(转)
    golang project 不显示文件夹 或者某个包明明能 import 但就是 import 不进来,提示Unresolved reference
    Qt6.2.4 qml 实现登录注册及显示详情demo
    Qt6.2.4 qml 实现文件选择与内容读取
    【转载】Qt6.2.4 qml ChartView 实现饼状图与问题解决
    【转载】AntvX6 流程图 demo 基于原生 js 支持导入与导出数据
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4217066.html
Copyright © 2020-2023  润新知