Python下的subprocess模块的入门指引

在熟悉了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)

登录后复制

这堆东西真让人抓狂:

201541690338006.jpg (594×692)

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

登录后复制

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

    但是下面的可以工作

立即学习“Python免费学习笔记(深入)”;

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()

201541690423588.jpg (657×375)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2294991.html

(0)
上一篇 2025年2月28日 02:50:06
下一篇 2025年2月27日 00:22:38

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 全面剖析Python的Django框架中的项目部署技巧第1/2页

    项目开始时是一个关键时刻,选择会对项目产生长期的影响。有很多关于如何开始使用django框架的教程,但很少讨论如何专业地使用django,或如何使用行业公认的最佳做法来确保你的项目规模的持续增长。事前的筹划让你(和所有同事的生活)在走向将来…

    编程技术 2025年2月28日
    200
  • 使用Python的Treq on Twisted来进行HTTP压力测试

    从事api相关的工作很有挑战性,在高峰期保持系统的稳定及健壮性就是其中之一,这也是我们在mailgun做很多压力测试的原因。 这么久以来,我们已经尝试了很多种方法,从简单的ApacheBench到复杂些的自定义测试套。但是本贴讲述的,是一种…

    编程技术 2025年2月28日
    200
  • Python代码调试的几种方法总结

    使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命…

    2025年2月28日 编程技术
    200
  • 详解Python中with语句的用法

    引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 W…

    编程技术 2025年2月28日
    200
  • 使用Python编写类UNIX系统的命令行工具的教程

    引言 您是否能编写命令行工具?也许您可以,但您能编写出真正好用的命令行工具吗?本文讨论使用 Python 来创建一个强健的命令行工具,并带有内置的帮助菜单、错误处理和选项处理。由于一些奇怪的原因,很多人并不了解 Python? 的标准库具有…

    编程技术 2025年2月28日
    200
  • python获取本机外网ip的方法

    本文实例讲述了python获取本机外网ip的方法。分享给大家供大家参考。具体如下: python从显示ip地址的网站获取本机外网ip,这段python代码抓取网站上的ip地址信息 import urllibimport reprint “w…

    编程技术 2025年2月28日
    200
  • Python中的元类编程入门指引

    回顾面向对象编程 让我们先用 30 秒钟来回顾一下 OOP 到底是什么。在面向对象编程语言中,可以定义 类,它们的用途是将相关的数据和行为捆绑在一起。这些类可以继承其 父类的部分或全部性质,但也可以定义自己的属性(数据)或方法(行为)。在定…

    编程技术 2025年2月28日
    200
  • python中常用检测字符串相关函数汇总

    本文实例汇总了python中常用检测字符串相关函数。分享给大家供大家参考。具体分析如下: 下面的python代码可用于检测字符串,包括是否全部为数字,是否包含数字,是否包含标题单词,是否包含大写字母,是否包含小写字母,是否包含空格,是否以指…

    编程技术 2025年2月28日
    200
  • 使用Python下的XSLT API进行web开发的简单教程

    kafka 样式的 soap 端点 Christopher Dix 所开发的“Kafka — XSL SOAP 工具箱”(请参阅 参考资料)是一种用于构造 SOAP 端点的 XSLT 框架。它只涵盖了 SOAP 1.1,但 Kafka 端点…

    2025年2月28日
    200
  • 使用Python中的线程进行网络编程的入门教程

    引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程、进程和异步 I/O 的支持。在许多情况下,通过创建诸如异步、线程和子进程之类的高层模块,Python 简化了各种并发方法的使用。除了标准库之外,还有一些第三方的解决方…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论