来源,之前在通过ffmpeg获取视频时长的时候遇到以下代码,对
subprocess.Popen()
的使用分析一下。
def getLenTime(filename):
# 这个list其实等于"ffprobe.exe -loglevel quiet -print_format json -show_format -show_streams -i <input video>"
command = ["ffprobe.exe","-loglevel","quiet","-print_format","json","-show_format","-show_streams","-i",filename]
注意:这是在windows环境下!!!
# shell=True 如果该参数为 True,将通过操作系统的 shell 执行指定的命令;
# subprocess.PIPE 表示为子进程创建新的管道;
# stderr错误句柄,subprocess.STDOUT 标准输出,stderr 可以合并到 stdout 里一起输出;
# 被调用时指定stderr=subprocess.STDOUT,那么stdout和stderr将会被整合到这一个属性中,且stderr将会为None;
# stdout 参数是 PIPE,此属性是一个类似 open() 返回的可读流。从流中读取子进程提供的输出。
# 以下命令的含义是:运行command shell语句,将运行的结果(连同报错信息)一起写入到二进制文件流中,并返回给result接收。
result = subprocess.Popen(command,shell=True,stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
# 读取结果
out = result.stdout.read()
# print(str(out)) # 二进制的文件流,b'{xxxx}
temp = str(out.decode('utf-8'))
# print(temp) # 有视频的详细信息,以json格式存储
data = json.loads(temp)["format"]['duration']
return float(data)
定义:subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
Popen() 方法
Popen 是 subprocess的核心,子进程的创建和管理都靠它处理。
构造函数:
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None,
stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None,
universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True,
start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
常用参数:
-
args:shell命令,可以是字符串或者序列类型(如:list,元组)
-
bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。
0:不使用缓冲区
1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
正数:表示缓冲区大小
负数:表示使用系统默认的缓冲区大小。
-
stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
-
preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
-
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
-
cwd:用于设置子进程的当前目录。
-
env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。
Popen.
stdin
如果
stdin
参数为
PIPE
,此属性是一个类似
open()
返回的可写的流对象。如果
encoding
或
errors
参数被指定或者
universal_newlines
参数为
True
,则此流是一个文本流,否则是字节流。如果
stdin
参数非
PIPE
, 此属性为
None
。
Popen.
stdout
如果
stdout
参数是
PIPE
,此属性是一个类似
open()
返回的可读流。从流中读取子进程提供的输出。如果
encoding
或
errors
参数被指定或者
universal_newlines
参数为
True
,此流为文本流,否则为字节流。如果
stdout
参数非
PIPE
,此属性为
None
。
Popen.
stderr
如果
stderr
参数是
PIPE
,此属性是一个类似
open()
返回的可读流。从流中读取子进程提供的输出。如果
encoding
或
errors
参数被指定或者
universal_newlines
参数为
True
,此流为文本流,否则为字节流。如果
stderr
参数非
PIPE
,此属性为
None
。
>>> import subprocess
>>> p = subprocess.Popen('ls -l', shell=True) # p = subprocess.Popen(['ls', '-cl'])
>>> total 164
-rw-r--r-- 1 root root 133 Jul 4 16:25 admin-openrc.sh
-rw-r--r-- 1 root root 268 Jul 10 15:55 admin-openrc-v3.sh
>>> p.returncode
>>> p.wait()
>>> p.returncode
这里也可以使用 p = subprocess.Popen(['ls', '-cl']) 来创建子进程。
Popen 对象方法
-
poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
-
wait(timeout): 等待子进程终止。
-
communicate(input,timeout): 和子进程交互,发送和读取数据。
-
send_signal(singnal): 发送信号到子进程 。
-
terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
-
kill(): 杀死子进程。发送 SIGKILL 信号到子进程。
import time
import subprocess
def cmd(command):
subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")
subp.wait(2)
if subp.poll() == 0: # 检查进程是否终止,如果终止返回 returncode,否则返回 None
print(subp.communicate()[1]) # 和子进程交互,发送和读取数据。
else:
print("失败")
cmd("java -version")
cmd("exit 1")
输出结果如下:
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
Python3 subprocess
https://docs.python.org/zh-cn/3/library/subprocess.html
源代码: Lib/subprocess.py
来源,之前在通过ffmpeg获取视频时长的时候遇到以下代码,对subprocess.Popen()的使用分析一下。def getLenTime(filename): # 这个list其实等于"ffprobe.exe -loglevel quiet -print_format json -show_format -show_streams -i <input video>" command = ["ffprobe.exe","-loglevel","quiet","-pr..
下面就是今天下午的研究成果。
发布系统需要响应用户的中断请求,需要在GET方法中杀掉由subprocess派生的子进程,刚开始直接用os.kill 发现子进程的子进程无法kill,谷歌了一些,发现kill可以干掉进程组,于是测试,但是默认情况下,subprocess派生的进程组和主程序,也就是我的web.py进程是在一个进程组里的,这要是kill了,那就调的了。
继续翻google,看subprocess的document时发现这个变量:
subprocess.CREATE_NEW_PROCESS_GROUPA Popen creationflags parameter to specify
子进程的终止
首先来看一段代码:
p = subprocess.Popen(['echo','helloworl.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(p.poll())
print('Exit code:', ...
文章目录subprocess模块subprocess.run() 函数的使用subprocess.Popen()函数实时获取subprocess子进程的输出多进程multiprocessing为什么要多进程?多进程实现方法
进程是资源分配的最小单位,线程是CPU调度的最小单位。做个简单的比喻:进程=火车,线程=车厢。
subprocess模块
Python的subprocess模块,用来创建和管理子进程(不是线程),并能够与创建的子进程的stdin,stdout,stderr连接通信,获取子进程执行
说明:写这部分的'原因'是shell本身功能'太单一',无法像'python'一样对'字符串'、'文件解析'、'正则表达式'-->'游刃有余'
补充:探讨'python'执行'shell'命令或'脚本'的历史轨迹
+++++++++++'语言应用场景'+++++++++++
1)'琐碎'任务一次性的任务交给shell
2)注定要'扩展',代码量'不小','要维护'的任务交给python
3)需要'效率'的工作交给C
备注:学习'subprocess'模块类比'lin..
一、subprocess.call() //成功0,失败非0 点击此处返回总目录
二、subprocess.check_call() //成功0,失败报错
三、subprocess.c...
把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己....
11-07
subprocess模块介绍
subprocess是python创建子进程的工具,其实和c中的fork出一个子进程,然后在子进程中运行exec执行另外一个进程很类似。
subprocess包中有很多方法创建子进程,这些函数创建子进程的行为不太一样,我们可以更具需求选择不同的方式来创建子进程。
使用subprocess包中的函数创建子进程的时候,要注意:
1) 在创建...
一、subprocess 模块简介
subprocess最早是在2.4版本中引入的。
subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值。
它用来代替多个旧模块和函数:
os.system
os.spawn*
os.popen*
popen2.*
commands.*
关于这个模
文章目录subprocess的介绍subprocess的使用
subprocess的介绍
subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。
subprocess的使用
subprocess的run、call、check_call、check_output函数
subprocess.run(args[, stdout, stderr, shell …]):执行args命令,返回值为CompletedProcess类;
若未指定std
要关闭一个进程,可以使用 `subprocess` 模块中的 `Popen` 类来启动子进程,并使用 `terminate()` 方法关闭进程。
以下是一个示例代码,它启动一个名为 `myprocess` 的进程,并在一段时间后关闭它:
```python
import subprocess
import time
# 启动子进程
process = subprocess.Popen(['myprocess'])
# 等待一段时间
time.sleep(10)
# 关闭进程
process.terminate()
你可以将 `myprocess` 替换成你想要关闭的进程的名称或路径。注意,这种方法只适用于能够通过进程名称或路径来唯一标识进程的情况。如果有多个同名进程或多个进程使用相同的路径,那么可能会关闭错误的进程。
kkdark:
【计算机视觉】CLIP
温柔小丸: