设为首页 收藏本站
查看: 897|回复: 0

[经验分享] Python模块subprocess小记

[复制链接]

尚未签到

发表于 2017-4-27 12:17:44 | 显示全部楼层 |阅读模式
在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了。
和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯。


subprocess.Popen



这个模块主要就提供一个类Popen:

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)

这堆东西真让人抓狂:



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创建自己的控制台窗口






  • 当初最感到困扰的就是 args 参数。可以是一个字符串,可以是一个列表。



subprocess.Popen(["gedit","abc.txt"])
subprocess.Popen("gedit abc.txt")

这两个之中,后者将不会工作。因为如果是一个字符串的话,必须是程序的路径才可以。(考虑unix的api函数 exec,接受的是字符串列表)


  • 但是下面的可以工作



subprocess.Popen("gedit abc.txt", shell=True)

这是因为它相当于

subprocess.Popen(["/bin/sh", "-c", "gedit abc.txt"])

都成了sh的参数,就无所谓了


  • 在Windows下,下面的却又是可以工作的



subprocess.Popen(["notepad.exe", "abc.txt"])
subprocess.Popen("notepad.exe abc.txt")

这是由于windows下的api函数CreateProcess接受的是一个字符串。即使是列表形式的参数,也需要先合并成字符串再传递给api函数。


  • 类似上面



subprocess.Popen("notepad.exe abc.txt" shell=True)

等价于

subprocess.Popen("cmd.exe /C "+"notepad.exe abc.txt" shell=True)


subprocess.call*



模块还提供了几个便利函数(这本身也算是很好的Popen的使用例子了)


  • call() 执行程序,并等待它完成



def call(*popenargs, **kwargs):
    return Popen(*popenargs, **kwargs).wait()


  • check_call() 调用前面的call,如果返回值非零,则抛出异常



def check_call(*popenargs, **kwargs):
    retcode = call(*popenargs, **kwargs)
    if retcode:
        cmd = kwargs.get("args")
        raise CalledProcessError(retcode, cmd)
    return 0


  • check_output() 执行程序,并返回其标准输出



def check_output(*popenargs, **kwargs):
    process = Popen(*popenargs, stdout=PIPE, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        raise CalledProcessError(retcode, cmd, output=output)
    return output


Popen对象



该对象提供有不少方法函数可用。而且前面已经用到了wait()/poll()/communicate()



poll()



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




wait()



等待结束,设置返回值




communicate()



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




send_signal()



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




terminate()



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




kill()



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




stdin

stdout

stderr



参数中指定PIPE时,有用




pid



进程id




returncode



进程返回值






参考






  • http://docs.python.org/library/subprocess.htcml



  • http://www.python.org/dev/peps/pep-0324/


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369998-1-1.html 上篇帖子: Python 核心编程总结 下篇帖子: Python笔记——类定义
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表