调用体系程序(转)ITeye - 超凡娱乐

调用体系程序(转)ITeye

2019年03月04日13时21分28秒 | 作者: 俊晖 | 标签: 进程,咱们,程序 | 浏览: 133

1. subprocess以及常用的封装函数

当咱们运转python的时分,咱们都是在创立并运转一个进程。正如咱们在Linux进程根底中介绍的那样,一个进程能够fork一个子进程,并让这个子进程exec别的一个程序。在Python中,咱们经过规范库中的subprocess包来fork一个子进程,并运转一个外部的程序(fork,exec见Linux进程根底)。

 

subprocess包中界说有数个创立子进程的函数,这些函数别离以不同的办法创立子进程,所以咱们能够根据需要来从中选取一个运用。别的subprocess还供给了一些办理规范流(standard stream)和管道(pipe)的东西,从而在进程间运用文本通讯。

 

运用subprocess包中的函数创立子进程的时分,要注意:

1) 在创立子进程之后,父进程是否暂停,并等候子进程运转。

2) 函数回来什么

3) 当returncode不为0时,父进程怎么处理。

 

subprocess.call()
父进程等候子进程完结
回来退出信息(returncode,相当于exit code,见Linux进程根底)

 

subprocess.check_call()

父进程等候子进程完结

回来0

查看退出信息,假如returncode不为0,则举出过错subprocess.CalledProcessError,该目标包括有returncode特点,可用try...except...来查看(见Python过错处理)。

 

subprocess.check_output()

父进程等候子进程完结

回来子进程向规范输出的输出成果

查看退出信息,假如returncode不为0,则举出过错subprocess.CalledProcessError,该目标包括有returncode特点和output特点,output特点为规范输出的输出成果,可用try...except...来查看。

 

这三个函数的运用办法相相似,咱们以subprocess.call()来阐明:

import subprocess
rc = subprocess.call(["ls","-l"])
咱们将程序名(ls)和所带的参数(-l)一同放在一个表中传递给subprocess.call()

 

能够经过一个shell来解说一整个字符串:

import subprocess
out = subprocess.call("ls -l", shell=True)
out = subprocess.call("cd ..", shell=True)
咱们运用了shell=True这个参数。这个时分,咱们运用一整个字符串,而不是一个表来运转子进程。Python将先运转一个shell,再用这个shell来解说这整个字符串。

shell指令中有一些是shell的内建指令,这些指令有必要经过shell运转,$cd。shell=True答应咱们运转这样一些指令。

 

2. Popen

实际上,咱们上面的三个函数都是根据Popen()的封装(wrapper)。这些封装的意图在于让咱们简单运用子进程。当咱们想要更个性化咱们的需求的时分,就要转向Popen类,该类生成的目标用来代表子进程。

 

与上面的封装不同,Popen目标创立后,主程序不会主动等候子进程完结。咱们有必要调用目标的wait()办法,父进程才会等候 (也就是堵塞block):

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
print("parent process")
从运转成果中看到,父进程在开启子进程之后并没有等候child的完结,而是直接运转print。

 

比照等候的状况:

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
child.wait()
print("parent process")


此外,你还能够在父进程中对子进程进行其它操作,比方咱们上面比如中的child目标:

child.poll()           # 查看子进程状况

child.kill()           # 终止子进程

child.send_signal()    # 向子进程发送信号

child.terminate()      # 终止子进程

 

子进程的PID存储在child.pid

 

3. 子进程的文本流操控

(沿袭child子进程) 子进程的规范输入,规范输出和规范过错也能够经过如下特点表明:

child.stdin

child.stdout

child.stderr

 

咱们能够在Popen()树立子进程的时分改动规范输入、规范输出和规范过错,并能够运用subprocess.PIPE将多个子进程的输入和输出衔接在一同,构成管道(pipe):

import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)
subprocess.PIPE实际上为文本流供给一个缓存区。child1的stdout将文本输出到缓存区,随后child2的stdin从该PIPE中将文本读取走。child2的输出文本也被存放在PIPE中,直到communicate()办法从PIPE中读取出PIPE中的文本。

要注意的是,communicate()是Popen目标的一个办法,该办法会堵塞父进程,直到子进程完结。

 

咱们还能够运用communicate()办法来运用PIPE给子进程输入:

import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")
咱们启动子进程之后,cat会等候输入,直到咱们用communicate()输入"vamei"。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    调用体系程序(转)ITeye

    进程,咱们,程序
  • 2
  • 3

    puttyITeye

    保存,用户名,暗码
  • 4

    1001ITeye

    小数点,个数,位数
  • 5
  • 6
  • 7

    vim装备ITeye

    文件,设置,状况
  • 8

    vim装备ITeye

    文件,设置,状况
  • 9

    WebService JaxITeye

    功用,客户端,运用
  • 10

    easymock快速入门ITeye

    运用,断语,机制