【python】Python中subprocess模块的参数解读以及应用实战

news2024/9/21 14:37:42

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • subprocess
    • 一、subprocess模块概述
      • 1.1 常用函数
      • 1.2 subprocess.Popen类
    • 二、subprocess.run()方法详解
      • 2.1 基本用法
        • 示例:执行ls命令
      • 2.2 参数解读
    • 三、subprocess.Popen()方法详解
      • 3.1 基本用法
        • 示例:执行ls命令并捕获输出
      • 3.2 参数解读
      • 3.3 进阶用法
        • 示例:使用Popen的wait()方法
    • 四、实际案例:使用subprocess执行系统命令并处理输出
      • 4.1 案例背景
      • 4.2 实现步骤
      • 4.3 代码实现
      • 4.4 注意事项
    • 五、异步执行命令
      • 5.1 使用`concurrent.futures.ThreadPoolExecutor`
    • 六、 捕获并处理信号
    • 七、替代方案
    • 八、使用`subprocess.Popen`进行更复杂的交互
      • 8.1 与子进程交互
      • 8.2 捕获子进程的退出码
      • 8.3 环境变量
      • 8.4 使用shell特性(谨慎)
      • 8.5 清理资源
    • 九、跨平台兼容性

subprocess

Python的subprocess模块是一个非常强大的工具,它允许用户启动新的进程,并与这些进程进行交互,获取其标准输入、标准输出、标准错误以及返回状态码等。这个模块提供了多种方式来执行外部命令和程序,并处理它们的输出和错误。在本文中,我们将通过实际案例详细介绍subprocess模块的使用方法和各个方法中参数的解读。

一、subprocess模块概述

subprocess模块是Python 2.4中新增的,旨在替换旧的如os.system()os.spawn*等函数。它提供了更加灵活和强大的方式来生成新的进程,并与之交互。subprocess模块的主要功能包括执行外部命令、捕获输出和错误信息、处理输入和输出管道、以及等待进程完成等。

1.1 常用函数

subprocess模块中,有几个常用的函数,它们分别是:

  • subprocess.run():Python 3.5及更高版本推荐使用,用于执行命令并等待其完成,返回一个CompletedProcess实例。
  • subprocess.Popen():提供了更多的灵活性,允许与进程进行交互,并不仅仅是等待它完成。
  • subprocess.call()subprocess.check_call()subprocess.check_output():这些函数是对subprocess.Popen的封装,提供了更简单的接口来执行命令并处理输出。

1.2 subprocess.Popen类

subprocess.Popensubprocess模块中最重要的类,它用于创建新的进程,并允许我们与这个进程进行交互。Popen的构造函数接受多个参数,这些参数定义了如何启动和管理子进程。

二、subprocess.run()方法详解

2.1 基本用法

subprocess.run()函数是Python 3.5及更高版本中推荐使用的执行外部命令的方式。它执行指定的命令,并等待命令完成,然后返回一个CompletedProcess实例。

示例:执行ls命令
import subprocess

# 执行ls命令,并捕获输出
result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE, text=True)
print(result.stdout)

在这个例子中,subprocess.run()函数接受一个包含命令及其参数的列表["ls", "-l"]stdout=subprocess.PIPE表示捕获标准输出,text=True表示将输出作为文本处理。
在这里插入图片描述
查看运行结果
在这里插入图片描述

2.2 参数解读

subprocess.run()是subprocess模块中一个常用的函数,也是官方推荐的方法,它用于运行命令并等待其完成。
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None, text=None, cwd=None, env=None, universal_newlines=None)

subprocess.run()函数的参数非常丰富,下面是一些常用的参数及其解释:

  • args:要执行的命令,可以是字符串或字符串列表。如果是字符串,且shell=True,则命令将通过shell执行。
  • stdinstdoutstderr:分别表示子进程的标准输入、标准输出、标准错误。可以设置为subprocess.PIPEsubprocess.DEVNULL、已存在的文件描述符、已打开的文件对象或None,我们使用时,默认为None就行。
  • input:作为子进程的输入发送的数据(默认为None)。
  • shell:如果为True,则通过shell执行命令。注意,这可能会带来安全风险,因为它允许执行shell命令,包括文件名通配符等。
  • timeout:设置命令的超时时间(秒)。如果命令执行时间超过这个时间,则抛出TimeoutExpired异常。
  • check:如果为True,且命令执行后返回状态码不是0,则抛出CalledProcessError异常。
  • universal_newlines(在Python 3.6及以后版本中被弃用,建议使用text):如果为True,则输入和输出都将以文本形式处理,而不是字节序列。
  • encoding:用于指定文本模式的编码方式。如果text=True,则此参数指定编码方式。
  • errors:用于指定文本模式下编码或解码错误的处理方式。
  • text: text=True表示将输出作为文本处理。默认是None

三、subprocess.Popen()方法详解

3.1 基本用法

subprocess.Popen()函数提供了比subprocess.run()更多的灵活性,它允许我们与进程进行更复杂的交互。

示例:执行ls命令并捕获输出
import subprocess

# 执行ls命令
process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

# 等待进程完成,并获取输出
out, err = process.communicate()
print("标准输出:", out)
print("标准错误:", err)

在这里插入图片描述
在这个例子中,subprocess.Popen()用于启动进程,并通过stdout=subprocess.PIPEstderr=subprocess.PIPE捕获标准输出和标准错误。然后,使用process.communicate()方法等待进程完成,并获取其输出和错误。
在这里插入图片描述

3.2 参数解读

subprocess.Popen()是subprocess模块中用于创建子进程的函数之一。它提供了更灵活的控制和处理子进程的能力。
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=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)

最新版
在这里插入图片描述

subprocess.Popen()的构造函数接受多个参数,这些参数定义了如何启动和管理子进程。以下是一些关键的参数及其解释:

  • args:要执行的命令,可以是字符串或字符串列表。如果是字符串,且shell=True,则命令将通过shell执行。推荐使用字符串列表,以避免shell注入等安全问题。
  • bufsize:指定缓冲区的大小。0表示无缓冲,1表示行缓冲,其他正整数表示缓冲区大小(字节),负数表示使用系统默认值。
  • executable:用于替换子进程中的shell来执行指定的命令。在Unix上,默认是/bin/sh。在Windows上,可执行文件通常从args列表中直接获取。
  • stdinstdoutstderr:与subprocess.run()相同,分别表示子进程的标准输入、标准输出、标准错误。
  • preexec_fn:在子进程执行前调用的函数。注意,这个函数只在Unix系统上有效,并且它只应该在子进程的安全环境中调用(即,在子进程启动后,但在执行任何来自args的命令之前)。
  • close_fds:在Unix系统上,如果为True,则除了stdinstdoutstderr之外的所有文件描述符都将在子进程中关闭。在Windows上,此参数被忽略。
  • shell:与subprocess.run()相同,如果为True,则通过shell执行命令。
  • cwd:设置子进程的当前工作目录。
  • env:用于子进程的环境变量字典。如果为None,则使用父进程的环境变量。
  • universal_newlines(在Python 3.6及以后版本中被弃用,建议使用text):如果为True,则输入和输出都将以文本形式处理,而不是字节序列。
  • startupinfocreationflags(仅限Windows):这两个参数用于控制子进程的创建方式,如窗口样式、继承的句柄等。
  • restore_signals(仅限Unix):如果为True,则所有Python信号处理器都将被恢复到它们在父进程中的状态。
  • start_new_session(仅限Unix):如果为True,则子进程将成为一个新的会话领导者,并且不会继承父进程的会话和进程组。
  • pass_fds(仅限Unix):一个包含要传递给子进程的额外文件描述符的序列。
  • encodingerrors:与subprocess.run()相同,用于指定文本模式下的编码方式和错误处理方式。

3.3 进阶用法

subprocess.Popen()提供了比subprocess.run()更多的灵活性,允许我们进行更复杂的进程管理。例如,我们可以使用Popen对象的poll()方法来检查子进程是否已结束,使用wait()方法来等待子进程结束并获取其退出码,或者使用send_signal()方法来向子进程发送信号。

示例:使用Popen的wait()方法
import subprocess

# 执行ls命令
process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

# 等待进程完成
exit_code = process.wait()
print(f"进程退出码: {exit_code}")

# 注意:此时已经不能通过communicate()获取输出了,因为它已经被wait()等待完成
# 如果需要输出,应该在wait()之前调用communicate()

在这里插入图片描述
在这个例子中,我们使用wait()方法等待进程完成,并获取其退出码。但是,请注意,一旦调用了wait()communicate()(后者也会等待进程完成),就不能再次调用communicate()来获取输出了,因为输出缓冲区已经被读取并清空。
在这里插入图片描述

四、实际案例:使用subprocess执行系统命令并处理输出

4.1 案例背景

假设我们需要编写一个Python脚本,该脚本需要执行系统命令grep来搜索文件中的内容,并处理搜索结果。我们将使用subprocess.run()来执行这个命令,并捕获其输出。

4.2 实现步骤

  1. 确定命令和参数:在这个案例中,我们将使用grep命令来搜索文件example.txt中包含特定字符串target的行。

  2. 执行命令并捕获输出:使用subprocess.run()执行命令,并通过stdout=subprocess.PIPEtext=True捕获输出。

  3. 处理输出:将捕获的输出(作为字符串)进行进一步处理,如打印到控制台或保存到文件中。

4.3 代码实现

下面是一个Python脚本的示例,它使用subprocess.run()来执行grep命令,并处理其输出。

import subprocess

# 定义要搜索的字符串和文件名
search_string = "target"
file_name = "example.txt"

# 构建grep命令的字符串列表
# 注意:为了安全起见,不要直接将用户输入直接拼接到命令中,这里我们只是使用固定值
grep_command = ["grep", search_string, file_name]

# 执行grep命令并捕获输出
try:
    result = subprocess.run(grep_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True)
    # check=True 会在命令执行失败(即非零退出码)时抛出 CalledProcessError 异常
    
    # 打印搜索到的行
    if result.stdout:
        print("搜索到的行:")
        print(result.stdout)
    else:
        print(f"在文件 {file_name} 中没有找到包含 '{search_string}' 的行。")
        
except subprocess.CalledProcessError as e:
    # 处理异常情况,比如grep命令不存在等
    print(f"执行命令时发生错误: {e}")

except Exception as e:
    # 处理其他可能的异常
    print(f"发生错误: {e}")

4.4 注意事项

  • 安全性:在上述示例中,由于search_stringfile_name是固定值,因此不需要担心shell注入等安全问题。但是,如果你打算将这些值替换为用户输入,你需要特别小心,避免直接将用户输入拼接到命令字符串中。一个更安全的方法是使用列表来构建命令参数,如本例所示。

  • 错误处理:在调用subprocess.run()时,可以通过设置check=True来自动检查命令的退出码。如果命令执行失败(即退出码非零),则会抛出subprocess.CalledProcessError异常。你可以通过捕获这个异常来优雅地处理错误情况。

  • 输出处理:在上述示例中,我们通过检查result.stdout来查看命令的输出。如果命令执行成功但没有输出(即result.stdout为空字符串),我们可以认为搜索未找到任何匹配项。如果命令执行失败,并且你希望捕获错误输出,可以通过检查result.stderr来实现。

  • 文本模式与字节模式:在Python 3中,默认情况下,subprocess.run()会以字节模式运行,即stdoutstderr都是字节序列。如果你希望以文本模式处理输出,可以设置text=True,这样stdoutstderr就会以字符串形式返回。同时,你也可以通过encoding参数来指定文本的编码方式。

通过上述案例,你可以看到subprocess模块在Python中执行外部命令和处理输出时的强大功能。无论是在脚本编写、自动化任务还是数据分析等领域,subprocess模块都是一个非常有用的工具。

当然,我们可以继续深入探讨subprocess模块的一些高级用法和最佳实践。

五、异步执行命令

如果你需要同时执行多个命令,并且希望它们并行运行而不是依次执行,你可以考虑使用asyncio模块与subprocess结合,或者使用concurrent.futures模块中的ThreadPoolExecutor。但是,请注意,由于subprocess模块本身是同步的,直接并行执行多个subprocess.run()subprocess.Popen()调用将需要多线程或多进程的支持。

5.1 使用concurrent.futures.ThreadPoolExecutor

import concurrent.futures
import subprocess

def run_command(command):
    try:
        result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        return f"Error: {e}"

# 命令列表
commands = [["ls", "-l"], ["grep", "some_pattern", "some_file.txt"]]

with concurrent.futures.ThreadPoolExecutor() as executor:
    # 启动所有命令的异步执行
    future_to_command = {executor.submit(run_command, command): command for command in commands}
    
    for future in concurrent.futures.as_completed(future_to_command):
        command = future_to_command[future]
        try:
            # 获取命令的输出
            data = future.result()
        except Exception as exc:
            # 处理异常
            data = str(type(exc))
        print(f'{command} 输出: {data}')

六、 捕获并处理信号

在Unix系统上,你可以使用signal模块与subprocess.Popen结合来捕获和处理信号。这对于需要优雅地终止子进程或响应系统事件(如用户中断)的应用程序特别有用。

import signal
import subprocess

def signal_handler(sig, frame):
    print(f'You pressed Ctrl+C! Signal: {sig}')
    # 尝试优雅地终止子进程
    process.terminate()

# 设置信号处理程序
signal.signal(signal.SIGINT, signal_handler)

# 启动子进程
process = subprocess.Popen(["some_long_running_command"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 主程序的其他部分...

# 注意:在这个简化的例子中,我们没有等待子进程完成。
# 在实际应用中,你可能需要调用 process.wait() 或其他机制来同步子进程的状态。

七、替代方案

虽然subprocess模块功能强大且灵活,但在某些情况下,你可能需要考虑其他替代方案,特别是对于那些需要更复杂交互或跨平台兼容性的应用程序。

  • pexpect:用于自动化交互式应用程序的Python模块,它可以模拟用户输入和响应。
  • paramiko:一个用于SSH2协议的Python实现,允许你远程执行命令、上传/下载文件等。
  • fabric(现已并入invoke):一个用于远程或本地执行命令的Python库,提供了更高级别的抽象。

八、使用subprocess.Popen进行更复杂的交互

subprocess.Popensubprocess模块中最强大的类,它允许你与子进程进行更复杂的交互。通过Popen,你可以设置各种输入输出流(stdin, stdout, stderr),并可以在子进程运行期间读取其输出或向其发送输入。

8.1 与子进程交互

import subprocess

# 启动子进程,设置stdin, stdout, stderr
# 注意:这里我们使用text=True以获取文本模式的输出
process = subprocess.Popen(
    ["python", "-c", "for line in sys.stdin: print('Echo:', line.strip())"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True,
    universal_newlines=True  # Python 3.7之前的版本可能需要这个参数
)

# 向子进程发送输入
try:
    # 发送多行输入
    for line in ["Hello, subprocess!", "Another line.", "Goodbye."]:
        process.stdin.write(line + "\n")
        process.stdin.flush()  # 确保数据被发送

        # 读取子进程的输出
        output = process.stdout.readline().strip()
        print(f"Received: {output}")

finally:
    # 关闭stdin,确保子进程可以结束
    process.stdin.close()

    # 等待子进程完成
    process.wait()

    # 获取并打印可能的错误输出
    if process.stderr:
        print(f"Stderr: {process.stderr.read()}")

注意:上述代码中的universal_newlines=True参数在Python 3.7及以后的版本中已被弃用,并被text=True参数所取代。我同时包含了universal_newlines以提醒旧版本Python的用户。

8.2 捕获子进程的退出码

子进程的退出码可以通过Popen对象的returncode属性获取,但在子进程完成之前,这个属性是None。你可以使用wait()方法来等待子进程完成并获取退出码。

process = subprocess.Popen(["some_command"])
process.wait()  # 等待子进程完成
exit_code = process.returncode  # 获取退出码
print(f"Exit code: {exit_code}")

或者,你可以使用run()方法的returncode属性,它会在命令执行后立即提供退出码(如果命令已经执行完成的话)。

8.3 环境变量

在启动子进程时,可以指定一个不同的环境变量字典。这对于需要在不同环境设置下运行命令的场景非常有用。

env = {
    "PATH": "/usr/bin:/bin",
    "MY_VAR": "some_value"
}
process = subprocess.Popen(["some_command"], env=env)

8.4 使用shell特性(谨慎)

虽然你可以通过将命令作为单个字符串并设置shell=True来利用shell的特性(如管道、文件通配符等),但这通常不推荐,因为它会使你的代码更容易受到shell注入攻击。如果你确实需要这样做,请确保你完全控制传递给shell的字符串,或者使用其他方法来避免这种风险。

# 谨慎使用,特别是当命令字符串包含用户输入时
output = subprocess.run("ls -l | grep some_pattern", shell=True, text=True, capture_output=True)

8.5 清理资源

当使用Popen时,确保在不再需要时关闭与子进程相关联的文件描述符(stdin, stdout, stderr)并等待子进程完成。这可以通过调用close()方法和wait()方法来实现,或者通过使用with语句(如果可用)来自动管理。

九、跨平台兼容性

当编写跨平台的脚本时,请注意不同操作系统之间路径分隔符、环境变量和shell特性的差异。尽量使用Python的库函数(如os.path.join())和模块(如shutilos)来避免硬编码的路径和命令,以增加代码的可移植性。

通过遵循这些指导原则和最佳实践,你可以更有效地使用subprocess模块来执行外部命令和处理输出,同时保持代码的安全性、可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用AI技术运营漫画推文,实现轻松变现

最近,漫画推文在各大平台上特别火,加上AI技术的加持,现在大家都有机会分一杯羹。今天我就来详细聊聊,如何利用AI技术来运营漫画推文,实现轻松变现。 项目介绍 咱们先来了解一下这个项目到底是啥。漫画推文,…

流量池是什么?萤石物联网卡流量池使用指南

要将4G设备通过萤石开放平台上云,有单卡模式/流量池两种使用模式,以下介绍流量池功能的使用方法 一、账号注册和登录 打开 萤石开放平台官网登录您的账号。若您还没有账号,请注册 二、申请物联网卡 登录后进入物联网卡申请页面没有卡的情况下…

【FreeRTOS】队列实验-多设备玩游戏(红外改造)

目录 0 前言1. 队列实验_多设备玩游戏2 回顾程序3 程序改进3.1 创建队列3.1.1 方法3.1.2 实践 3.2 读队列3.2.1 方法3.2.2 实践 3.3 写队列3.3.1 方法3.3.2 实践 0 前言 学习视频: 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基…

WPS真题题库导入刷题小程序:百思考个人使用经验分享

这篇文章的诞生,是因为我即将踏上一场超级有趣的挑战——备考全国计算机等级二级WPS Office高级应用与设计的冒险之旅! WPS的分值: 单项选择题20分(含公共基础知识部分10分)。 WPS处理文字文档操作题30分。 WPS处理电子表格操作题30分。 …

Taro+Vue 创建微信小程序

TaroVue 创建微信小程序 一、全局安装 tarojs/cli二、项目初始化三、现在去启动项目吧 一、全局安装 tarojs/cli npm install -g tarojs/cli //安装 npm info tarojs/cli //查看安装信息 如果正常显示版本说明成功了,就直接跳到第二步吧官网说:…

如何快速自学开源项目?试试我的诀窍

大家好,我是程序员鱼皮。上周二晚上我直播带大家学习了一个 GitHub 上不错的开源聊天室项目 MallChat ,大家表示学到了很多,所以我专门剪出了一期项目导学视频,分享给大家: https://www.bilibili.com/video/BV1Q142147…

Redis 高可用性如何实现?

Redis 高可用性如何实现? 1、主备切换2、哨兵集群 💖The Begin💖点点关注,收藏不迷路💖 Redis,作为广泛使用的内存数据结构存储系统,通过一系列机制和策略,如主备切换、哨兵&#xf…

vue脚手架配置代理(解决跨域问题)

vue配置代理 一.介绍二.方法一三.方法二 一.介绍 跨域问题是指协议,主机,端口有一个以上不同 解决方法: 1,cors(最标准) 2,jsonp(script src)(比较巧妙) 3&a…

使用MongoDB构建AI:Story Tools Studio将生成式AI引入Myth Maker AI游戏

Story Tools Studio利用先进的生成式AI技术,打造沉浸式、个性化、无穷尽的情景体验。 Story Tools Studio创始人兼首席执行官Roy Altman表示:“我们的旗舰游戏Myth Maker AI采用的是我们自主研发的、以AI为驱动的专家指导型故事生成器MUSE,它…

跨境电商新手必知:轻松解决商品详情图一键翻译难题!

在做跨境电商,商品详情图的翻译是至关重要的一环。 对于刚刚踏上跨境电商之旅的个人创业者来说,如何实现一键翻译商品详情图,可能是一个令人头疼的问题。 别担心,现在有许多实用的工具和方法可以帮助您轻松应对。 比如&#xff…

使用Windows11搭建代理服务器

一、问题引入二、下载并安装apache服务器三、配置Apache服务四、安装服务并测试五、文中提到的下载文件集合一、问题引入 使用ccproxy总是有很多限制,而且总是中断,因此就想自己用windows搭建一个。 二、下载并安装apache服务器 进入apache官网https://httpd.apache.org/do…

C/C++实现蓝屏2.0

🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 前…

在使用JMeter做负载测试遇到过的坑

1、本人做的是HTTP测试。遇到一个错误提示 415 not suported mediatype 注意,需要添加一个HTTP信息头管理信息,在运行的时候,请保持它启动是启用状态。 添加步骤如下图。 相关配置信息如下图。因为采用了JWTTOKEN进行权限验证&#xff0c…

SQL面试题练习 —— 有序行转列

目录 1 题目2 建表语句3 题解 1 题目 有学生各学科分数表,记录了学生的各科分数,请按照学生粒度,生成两列数据分别为学科和分数,要求学科内的顺序与分数顺序一致。 样例数据 期望结果 2 建表语句 --建表语句 create table if not…

偶然遇到了scanf输入字符时,前面与要加上空格

任务描述 本关任务:给定一个含有n个学生数据元素的数组a,用头插法来快速创建整个单链表。 相关知识 创建单链表有两种方法: 先初始化一个单链表,然后向其中一个一个地插入元素,通过调用基本运算算法来创建单链表。…

基于springboot-vue的毕业论文管理系统

TOC springboot251基于springboot-vue的毕业论文管理系统 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化…

海康VisionMaster使用学习笔记1-本地图像导入及参数设置

前言 原计划直接学习海康相机二次开发,发现先学习使用海康VisionMaster很有必要,与其他相机工具还有用法不太相同.开始记录一下海康VisionMaster使用学习笔记. 本地图像导入及参数设置 本地图像导入 在工具箱中找到采集 拖取图像源模块到流程编辑区域 双击图像源,选择图像源…

STM32cubeMX配置Systick的bug

STM32cubeMX版本:6.11.0 现象 STM32cubeMX配置Systick的时钟,不管选择不分频 还是8分频。 生成的代码都是一样的,代码都是不分频。 即不管选择不分频还是8分频,Systick都是使用的系统时钟 函数调用 HAL_Init() → HAL_Init…

【深度学习】单层神经网络

单层神经网络 神经元感知机 1943年,心理学家McCulloch和数学家Pitts共同发表了神经网络的开山之作A Logical Calculus of the Ideas Immanent in Nervours Activity1,提出了神经网络的第一个数学模型——MP模型。该模型也成为了人工神经网络的基础。 神经…

ELK学习笔记

ElasticStack分布式日志系统概述 Elasticsearch: 一个分布式搜索引擎,能够快速存储、搜索和分析大量数据。核心概念包括索引(Index)、文档(Document)和分片(Shard)。使用 RESTful API 进行数据操…