概述
21.1 subprocess
执行程序,获取返回码或输出信息。
• call: 返回 ExitCode。
• check_call: 如果 ExitCode != 0,抛出 CalledProcessError 异常。
• check_output: 返回输出信息。ExitCode != 0 抛出异常。
命令行行参数可以用 shlex.split 分解成列表
>>> from subprocess import *
>>> from shlex import split
>>>
>>> s = check_output(split('ls -l'))
>>> print(s)
b'xe6x80xbbxe7x94xa8xe9x87x8f 28n-rw-rw-r-- 1 sun sun 23153 6xe6x9cx88 8 15:03 maoyan.txtndrwxrwxr-x 3 sun sun 4096 6xe6x9cx88 22 07:23 spidern'
>>> from subprocess import Popen, PIPE
>>> Popen('find . -name "*.txt" | xargs ls -l', shell=True).wait()
-rw-rw-r-- 1 sun sun 23153 6月 8 15:03 ./maoyan.txt
0
>>> p = Popen('find . -name "*.txt" | xargs ls -l', shell=True, stdout=PIPE) # 使用PIPE改变输出对象
>>> p.pid
24542
>>> print(p.stdout.read())
b'-rw-rw-r-- 1 sun sun 23153 6xe6x9cx88 8 15:03 ./maoyan.txtn'
>>> p.wait()
0
22.2 signal
信号是软中断,提供了一种异步事件通知机制,python默认已经安装了一些信号处理器,比如SIGPIPE被忽略,SIGINT引发Keyboardinterrupt异常, 捕获SIGTERM调用退出函数
常用信号
• SIGINT: 用户中断 (ctrl + c)。
• SIGTERM: 由 kill() 发送,进程终止。
• SIGCHLD: 子进程终止。
• SIGHUP: 终端会话终止。
• SIGSTP: 进程暂停 (ctrl + z)。
• SIGALRM: 告警。
注意:信号SIGKILL,SIGSTOP不能被捕获
signal
仅能在主线程调用 signal() 注册信号处理器函数,它会移除当前处理动作。可用用 getsignal() 获
取,在需要时重新注册。有两个特殊的处理器:SIG_IGN 忽略信号,SIG_DFL 默认处理。
from signal import * from time import time, sleep def sig_handler(signum, frame): print('KeyboardInterrupt') exit(0) def main(): signal(SIGINT, sig_handler) while True: sleep(1) print(time()) if __name__ == '__main__': main() # 1498090322.9949114 # 1498090323.9951088 # 1498090324.9962428 # KeyboardInterrupt
中断信号被拦截,我们可以自主决定是否终止进程. 在 GDB 里,用 SIGINT 来处理调试中断。也有
一些软件用 SIGUSR1、SIGUSR2 作为外部通知事件,比如重启什么的。信号处理会被带入fork()
创建的子进程
pause
函数 pause() 会使进程休眠,直到进程接收到信号。信号要么被处理,要么终止进程
from signal import * from time import time def sig_handler(signum, frame): print('sig:', signum) def main(): signal(SIGUSR1, sig_handler) while True: print(time()) pause() if __name__ == '__main__': main()
如果收到 SIGUSR1 信号, 则进程苏醒后显示时间, 然后再次休眠,如果是其他信号,进程终止
alarm
在 n 秒后发送一个 SIGALRM 告警信号。或用 0 秒取消所有尚未到期的告警
signal(SIGALRM, sig_alarm) # 捕获信号 alarm(2) # 2s后发送警告信号, 仅一次
timer
用来设置在 seconds 秒后发出信号,并在此以后每隔 interval 秒重复发出信号。参数 which 决定
了发出何种信号
• ITIMER_REAL: SIGALRM
• ITIMER_VIRTUAL: SIGVTALRM
• ITIMER_PROF: SIGPROF
将 seconds 设置为 0,将清除定时器
23.2 shlex
shlex 是一个分割 Unix Shell 命令行参数的简单词法分析器。
>>> split("ls -l /usr/local")
['ls', '-l', '/usr/local']
转载于:https://my.oschina.net/acutesun/blog/994971
最后
以上就是等待曲奇为你收集整理的python 读书笔记 (十二) 进程通信的全部内容,希望文章能够帮你解决python 读书笔记 (十二) 进程通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复