我眼中的subprocess

简介: os模块入门管道进程交互pypy运行结果总结最近打算写个”远程控制“小工具,”胖客户端“这边功能已经开发完毕了。试想一下这样的场景,你的笔记本电脑在图书馆正常的放着,然后你去了教学区上课去了。

最近打算写个”远程控制“小工具,”胖客户端“这边功能已经开发完毕了。试想一下这样的场景,你的笔记本电脑在图书馆正常的放着,然后你去了教学区上课去了。然后你想看一下自己电脑前有没有人,然后就可以通过手机发送一条命令,让笔记本电脑拍照,并发送给手机。或者你的同学在你的电脑边,然后你远程用手机发一条指令,让电脑发出鬼叫或者播放音乐什么的··· ···

但是遗憾的是这个”远程操作“功能成为了瓶颈,其实就是怎么让当前进程去执行额外命令。 还好遇到了subprocess。然后就可以很方便的”为所欲为“啦。


os模块

也许在subprocess之前,你可能听说过os模块。如:

import os
cmdstr = "some cmd command"
os.system(cmdstr)

这种方式可以很轻松的执行Windows上的命令,但是缺点是:
不受控,没有返回结果。对于简单的需求而言还行,但是对于需要获取返回结果的就不太适用了。

入门

相比较subprocess, 执行一条命令就方便多了。比如实现与os模块相同功能的话,可以使用如下代码:

import subprocess

cmdstr = "some cmd command"
subprocess.call(cmdstr)

当你想执行带有命令行参数的命令的时候,也是比较方便的。可以使用一个列表盛放需要执行的命令。subprocess底层会默认将这个列表拼装成命令字符串。

import subprocess
cmdstr1 = 'ping'
cmdstr2 = 'www.douban.com'
subprocess.call([cmdstr1, cmdstr2])

除此之外,还有
- subprocess.check_call()

  • subprocess.check_out_put

等函数。按需选取就行了。

管道

熟悉命令行的同行肯定对于管道|不陌生了。工作在进程之间,为操作的提供了巨大的便利。尤其是linux爱好者,管道的魅力更甚。

当然了,windows上也是支持的,比方说,找出笔记本电脑上网卡网段为192.开头的信息。就可以这样办。
管道使用示例

同样,在subprocess中,PIPE的原理也是一样的。如果需要让管道起作用的话,Popen内相关参数要设置为PIPE即可。这一点可以参照文档,这里不再叙述。

进程交互

典型的场景就是,父进程内开启一个子进程,并获取子进程的执行的返回结果。

这个时候,就需要指定stdin, stdout为PIPE形式了。否则的话,两个进程之间是无法进行交流的。这就好比两个池塘,相互有自己的资源,如果内有一个通道的话,两个池塘就没办法”交流“。

1.py

import sys
s = "this is from {}".format(__file__)

sys.stdout.write(s)

2.py

import subprocess
import sys
try:
    child = subprocess.Popen('python ./1.py', stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
    print child.stdout.readline()

except Exception as e:
    print e

运行结果

交互结果

如上,不难看出。父进程2.py最终得到了子进程1.py的运行结果的。

虽然这个很明显是单向的”交流“,但是已经满足博主的需求了。这就好比士兵对于命令的服从,给出指令,尽管执行便是,最后把结果反馈回来即可。

但是如果非要双向交流的话,那就得借助于communicate()方法了。

总结

本文简单的介绍了相关于subprocess模块的使用,比较通俗,也比较浅显。对于简单需求应该是够用的啦,但是非要深挖的话,还是得去看官方文档的好。

(^__^) 嘻嘻……

目录
相关文章
|
4月前
|
人工智能 自然语言处理 前端开发
Python潮流周刊#7:我讨厌用 asyncio
Python潮流周刊#7:我讨厌用 asyncio
46 0
|
6天前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
17 6
|
14天前
|
消息中间件 数据采集 数据库
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【9月更文挑战第7天】在这个数字化时代,软件系统日益复杂,单进程已难以高效处理海量数据。Python IPC(进程间通信)技术应运而生,使多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的Pipe等功能,进程间可以直接传递数据,无需依赖低效的文件共享或数据库读写。此外,Python IPC还提供了消息队列、共享内存和套接字等多种机制,适用于不同场景,使进程间的合作更加高效、精准。这一技术革新让开发者能轻松应对复杂挑战,构建更健壮的软件系统。
26 1
|
3月前
|
程序员 Windows
老程序员分享:popen实用实战
老程序员分享:popen实用实战
26 0
|
4月前
|
程序员 Linux 网络安全
optee os syscall,35岁以后的网络安全程序员出路在哪里
optee os syscall,35岁以后的网络安全程序员出路在哪里
代码之禅:在技术的浪潮中寻找内心的平静
【5月更文挑战第20天】 在数字化时代的洪流中,技术感悟成为了每个从业者心中的一盏灯塔。本文将探讨如何在快节奏、高压力的技术行业中保持个人的专业性与内心平静,并实现职业生涯的持续成长。通过分享个人经验与行业内的最佳实践,我们将一同探索在不断变化的技术世界中如何维持自我平衡,以及如何将这种平衡转化为技术创新和解决问题的动力。
|
存储 Python
亲戚大学生暑假在家没事干?教他用Python写一个简单的贪吃蛇游戏,你想学吗?
@[TOC](目录) 亲戚大学生暑假在家没事干?教他用Python写一个简单的贪吃蛇游戏,你想学吗? 贪吃蛇游戏(Snake Game)是一种经典的益智游戏,玩家需要控制蛇的头部移动,吃掉食物,并不断增长蛇的身体。在游戏过程中,蛇不能碰到墙壁或自身,否则游戏结束。本教程将详细介绍如何使用 Python 语言和 Pygame 库编写一个贪吃蛇游戏。 本文分为以下几个部分: 1. 游戏整体设计 2. Pygame 库介绍 3. 基础类和函数 4. 游戏界面和控制 5. 蛇和食物的实现 6. 碰撞检测 7. 游戏循环和得分系统 8. 完整代码及运行 # 1. 游戏整
|
数据采集 自然语言处理 前端开发
python,你也和小猪佩奇一样社会了!
python,你也和小猪佩奇一样社会了!
83 0
|
Unix 芯片
[oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs
[oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs
106 0
[oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs
|
Python
python植物大战僵尸十五之僵尸来袭(不同行)
python植物大战僵尸十五之僵尸来袭(不同行)
81 0