添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

来源,之前在通过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 &lt;input video&gt;" 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模块   Pythonsubprocess模块,用来创建和管理子进程(不是线程),并能够与创建的子进程的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模块介绍   subprocesspython创建子进程的工具,其实和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: 表情包表情包如果目标分布是有变化的(如同为猫的样本,不同的样本,其值也会有差异),那么就不能使用交叉熵,例如蒸馏模型的损失函数就是KL散度,因为蒸馏模型的目标分布也是一个模型,该模型针对同类别的不同样本,会给出不同的预测值(如两张猫的图片a和b,目标模型对a预测为猫的值是0.6,对b预测为猫的值是0.8)。 这个例子举得不错。表情包 【计算机视觉】CLIP 温柔小丸: 请问您会改进clip的代码在ood上吗 我有思路但是不会写代码