python popen函数讲解_subprocess.Popen()详解

本文详细介绍了Python的subprocess.Popen类,包括参数说明、使用示例和常见方法。通过Popen可以创建子进程,控制其输入、输出和错误流,并获取子进程的返回值。此外,还提到了如何避免管道死锁以及使用Popen替代其他函数的方法。
摘要由CSDN通过智能技术生成

一、subprocess.Popen

subprocess模块定义了一个类: 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:

args参数。可以是一个字符串,可以是一个包含程序参数的列表。要执行的程序一般就是这个列表的第一项,或者是字符串本身。

subprocess.Popen(["cat","test.txt"])

subprocess.Popen("cat test.txt")

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

列表)

但是下面的可以工作

subprocess.Popen("cat test.txt", shell=True)

这是因为它相当于

subprocess.Popen(["/bin/sh", "-c", "cat test.txt"])

在*nix下,当shell=False(默认)时,Popen使用os.execvp()来执行子程序。args一般要是一个【列表】。如果args是个字符串的

话,会被当做是可执行文件的路径,这样就不能传入任何参数了。

注意:

shlex.split()可以被用于序列化复杂的命令参数,比如:

>>> shlex.split('ls ps top grep pkill')

['ls', 'ps', 'top', 'grep', 'pkill']

>>>import shlex, subprocess

>>>command_line = raw_input()

/bin/cat -input test.txt -output "diege.txt" -cmd "echo '$MONEY'"

>>>args = shlex.split(command_line)

>>> print args

['/bin/cat', '-input', 'test.txt', '-output', 'diege.txt', '-cmd', "echo '$MONEY'"]

>>>p=subprocess.Popen(args)

可以看到,空格分隔的选项(如-input)和参数(如test.txt)会被分割为列表里独立的项,但引号里的或者转义过的空格不在此列

。这也有点像大多数shell的行为。

在*nix下,当shell=True时,如果arg是个字符串,就使用shell来解释执行这个字符串。如果args是个列表,则第一项被视为命令,

其余的都视为是给shell本身的参数。也就是说,等效于:

subprocess.Popen(['/bin/sh', '-c', args[0], args[1], ...])

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

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

subprocess.Popen("notepad.exe test.txt")

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

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

等同于

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

b

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值