行业资讯
📅 2026/8/7 15:02:41
Python自动化入门:从环境搭建到实战场景的完整指南
1. 从“重复劳动”到“一键执行”为什么你需要Python自动化如果你每天的工作里有超过30%的时间是在重复点击鼠标、复制粘贴数据、整理格式雷同的文件或者守着电脑等待某个漫长的流程结束那么这篇文章就是为你准备的。我说的不是那些需要复杂决策和创造力的核心工作而是那些枯燥、繁琐、但又不得不做的“体力活”。比如从几十个Excel表格里汇总数据给几百个客户批量发送格式化的邮件或者定时从某个网站抓取最新的价格信息。这些任务消耗着你的精力却很难带来成长和成就感。Python这门语法简洁、库生态丰富的编程语言正是解决这类问题的绝佳工具。它不像一些传统编程语言那样有很高的入门门槛其设计哲学强调“用一种方法最好是只有一种方法来做一件事”这让它的代码读起来常常像伪代码一样直观。更重要的是围绕自动化这个场景Python社区已经构建了极其强大的工具链用pandas处理表格数据易如反掌用selenium或playwright可以模拟人在浏览器里的所有操作用schedule或操作系统的定时任务可以让脚本在深夜自动运行……自动化不是取代你的工作而是把你的双手和大脑从机械劳动中解放出来让你能专注于更有价值的部分。很多人对编程望而却步觉得那是工程师的专属领域。但我想告诉你针对办公自动化、数据处理、网络信息抓取这类具体场景的学习路径是完全不同的。你不需要理解复杂的计算机原理也不需要从数据结构与算法开始啃起。你的学习目标非常明确用代码描述你手头正在做的重复性动作。这个过程更像是在教一个不知疲倦、绝对服从的助手如何工作。一旦你掌握了几个核心的库和基本的逻辑思维你会发现很多你以为需要专门软件或高价服务才能解决的问题几行Python代码就能轻松搞定。2. 构建你的第一个自动化工作台环境与工具避坑指南在开始写第一行自动化代码之前一个稳定、顺手的环境是成功的一半。很多新手在第一步“安装Python”上就踩了坑导致后续问题不断。这里我结合自己的经验给你梳理一条最稳妥的路径。2.1 Python解释器的安装与版本选择首先忘掉那些第三方打包的“一键安装版”或某些教程里古老的Python 2.7。请直接访问Python官方网站python.org的下载页面。当前的主流且稳定的版本是Python 3.9到3.11系列。我推荐选择Python 3.9或3.10因为它们在稳定性与库的兼容性上达到了一个很好的平衡。最新版的3.12或3.13可能对一些第三方库的支持还不够完善。安装时有一个至关重要的选项必须勾选“Add Python to PATH”。这个选项的作用是把Python和它的包管理工具pip的路径添加到系统的环境变量中。只有这样你才能在命令行CMD或终端的任何位置直接输入python或pip来运行它们。很多新手安装后无法在命令行使用Python十有八九是因为漏掉了这一步。注意如果你在安装时忘记了勾选也不用重装。可以手动将Python的安装路径例如C:\Users\你的用户名\AppData\Local\Programs\Python\Python39和其下的Scripts文件夹路径添加到系统的环境变量Path中。这是一个稍微进阶一点的操作但网上有大量详细的图文教程。安装完成后验证一下。打开命令行Windows下按WinR输入cmdMac下打开终端输入python --version。如果正确显示了你安装的版本号比如Python 3.9.13那么第一步就成功了。同时输入pip --version确认包管理工具也已就位。2.2 代码编辑器的抉择VSCode vs. PyCharm vs. 轻量级在线工具工欲善其事必先利其器。一个好的编辑器能极大提升编码效率和体验。对于自动化脚本开发我首推Visual Studio Code (VSCode)。它是免费的轻量且功能通过插件无限扩展。对于自动化场景你需要安装两个核心插件Python插件由Microsoft官方提供提供代码高亮、智能提示IntelliSense、代码格式化、调试等功能。Pylance这是一个强大的语言服务器能提供更精准的类型提示和代码补全。配置VSCode的Python环境也很简单。安装好Python插件后在VSCode左下角会显示当前使用的Python解释器版本点击它可以切换到你刚安装的版本。然后新建一个.py文件就可以开始编码了。VSCode对新手友好社区资源丰富遇到任何界面或配置问题都容易找到答案。当然如果你预算充足且主要进行Python开发PyCharm的专业版是更强大的选择它集成了更多开箱即用的高级功能如数据库工具、Web框架支持等但对于纯自动化脚本社区免费版也完全够用。至于网络热词中提到的“lightly在线编程”或其它在线IDE它们适合在无法安装本地环境的电脑上做临时性的、简单的代码尝试或教学。但对于严肃的、涉及本地文件操作如读写Excel、调用系统命令的自动化项目强烈建议搭建本地开发环境。在线环境的网络延迟、文件系统隔离、依赖库安装限制等都是自动化任务的巨大障碍。2.3 依赖管理用虚拟环境隔离你的项目这是很多教程会忽略但实际项目中至关重要的一步。不同的自动化项目可能需要不同版本的同个库。直接在系统全局安装所有库迟早会导致版本冲突让项目无法运行。Python通过虚拟环境Virtual Environment来解决这个问题。它为每个项目创建一个独立的Python运行环境包括独立的解释器和包目录。操作很简单为你项目新建一个文件夹比如my_auto_project。在命令行中进入这个文件夹cd my_auto_project。创建虚拟环境python -m venv venv。这个命令会在当前文件夹下创建一个名为venv的虚拟环境目录。激活虚拟环境Windows:venv\Scripts\activateMac/Linux:source venv/bin/activate激活后你的命令行提示符前会出现(venv)字样表示你正工作在这个独立环境中。之后所有通过pip install安装的包都只会安装到这个venv目录下与系统全局环境和其他项目互不干扰。在VSCode中你可以通过按F1打开命令面板输入Python: Select Interpreter然后选择刚才创建的虚拟环境路径下的python.exe这样VSCode也会在这个环境中运行和调试你的代码。3. 自动化核心武器库必备Python库详解与实战入门掌握了环境我们就来认识一下自动化任务中的“瑞士军刀”。下面这几个库几乎能覆盖80%的办公自动化场景。3.1 数据处理之王Pandas如果你的自动化任务涉及Excel、CSV等表格数据那么pandas是你必须征服的工具。它不是一个简单的读写库而是一个强大的数据分析框架。安装它pip install pandas。核心操作场景批量读取与合并假设你有销售部门1月到12月的12个Excel文件需要汇总。用pandas几行代码就能搞定。import pandas as pd import os all_data [] folder_path ./销售数据 for file in os.listdir(folder_path): if file.endswith(.xlsx): # 读取每个Excel文件 df pd.read_excel(os.path.join(folder_path, file)) all_data.append(df) # 合并所有数据 final_df pd.concat(all_data, ignore_indexTrue) # 保存到新文件 final_df.to_excel(全年销售汇总.xlsx, indexFalse)数据清洗与转换自动删除空行、统一日期格式、计算新列如“销售额单价*数量”。# 删除“客户名”列为空的行 cleaned_df final_df.dropna(subset[客户名]) # 将“订单日期”列转换为标准的日期时间格式 cleaned_df[订单日期] pd.to_datetime(cleaned_df[订单日期]) # 计算销售额 cleaned_df[销售额] cleaned_df[单价] * cleaned_df[数量]分组统计快速生成报表例如按“销售区域”分组计算每个区域的总销售额和平均单价。report cleaned_df.groupby(销售区域).agg({销售额: sum, 单价: mean}) print(report)避坑经验pandas默认的read_excel依赖openpyxl或xlrd库来处理.xlsx文件。如果你遇到相关错误记得用pip install openpyxl安装它。对于.xls老格式文件可能需要xlrd。3.2 浏览器自动化双雄Selenium 与 Playwright当你的任务需要登录网站、点击按钮、填写表单、抓取动态加载的数据时就需要模拟浏览器操作。selenium是老牌且强大的工具而playwright是微软推出的后起之秀在某些方面更现代、更强大。Selenium 基础实战 安装pip install selenium。你还需要下载对应浏览器的驱动如ChromeDriver并将其所在目录添加到系统PATH或者将驱动文件放在项目目录下。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time # 启动浏览器 driver webdriver.Chrome() # 确保chromedriver在PATH或当前目录 driver.get(https://www.example.com/login) # 找到用户名密码输入框并输入 username driver.find_element(By.ID, username) password driver.find_element(By.ID, password) username.send_keys(your_username) password.send_keys(your_password) # 找到登录按钮并点击 login_button driver.find_element(By.XPATH, //button[typesubmit]) login_button.click() time.sleep(3) # 等待页面加载 # ... 后续操作如抓取数据 driver.quit()Playwright 的优势 安装pip install playwright然后安装浏览器内核playwright install。 Playwright的API设计更一致自动等待机制更智能减少了很多time.sleep并且原生支持无头模式、移动端模拟、录制生成代码等高级功能。对于现代Web应用大量使用JavaScript动态渲染Playwright往往更稳定。from playwright.sync_api import sync_playwright with sync_playwright() as p: browser p.chromium.launch(headlessFalse) # headlessTrue 无界面模式 page browser.new_page() page.goto(https://www.example.com) page.fill(#search, 自动化) page.click(button[typesubmit]) # Playwright会自动等待元素出现无需手动sleep content page.text_content(.result) print(content) browser.close()选择建议如果你的项目需要兼容旧的代码或环境或者社区资源特定问题的解决方案对你更重要选selenium。如果你开始一个新项目追求更快的执行速度和更稳定的自动化特别是对付复杂的单页面应用SPA强烈推荐playwright。3.3 定时任务与系统交互自动化脚本写好之后你肯定不想每天手动去运行它。这时就需要定时任务。轻量级方案Schedule库如果你的脚本需要在一个长期运行的Python程序中定时执行比如一个一直在服务器上跑的后台服务schedule库非常直观。import schedule import time def job(): print(开始执行每日数据备份...) # 这里调用你的备份函数 print(备份完成) # 每天上午10:30执行 schedule.every().day.at(10:30).do(job) while True: schedule.run_pending() time.sleep(60) # 每分钟检查一次操作系统级方案Cron (Linux/Mac) 或 任务计划程序 (Windows)这是更通用、更可靠的方式。你的脚本写好之后通过操作系统的定时任务工具来调用它。Windows搜索“任务计划程序”创建一个基本任务设置触发时间如每天操作为“启动程序”程序或脚本填写你的python.exe的完整路径参数填写你的脚本文件如D:\auto\my_script.py的完整路径。Linux/Mac使用crontab -e编辑定时任务。例如添加一行30 10 * * * /usr/bin/python3 /home/user/auto/my_script.py表示每天10:30执行。这种方式下你的脚本应该是独立的、能从头到尾执行完毕的。确保在脚本开头通过import sys; sys.path.append(...)等方式处理好模块导入路径问题。4. 典型自动化场景拆解从思路到代码的完整实现了解了核心工具我们来看几个具体的场景把思路转化为可运行的代码。我会重点讲清楚“为什么这么做”和“可能遇到的坑”。4.1 场景一批量处理与重命名文件夹内文件需求一个文件夹里有几百张图片文件名杂乱无章如IMG_20230101_123456.jpg,DSC_1234.JPG需要统一重命名为产品图_001.jpg,产品图_002.jpg这样的格式。思路拆解使用os库列出文件夹内所有文件。过滤出图片文件通过后缀名判断。按照一定的顺序如文件创建时间对文件列表进行排序。循环遍历列表为每个文件生成新名字并用os.rename进行重命名。代码实现与详解import os from pathlib import Path def batch_rename_images(folder_path, prefix产品图): 批量重命名指定文件夹内的图片文件。 Args: folder_path (str): 图片文件夹路径。 prefix (str): 新文件名的前缀。 # 使用Path对象路径操作更安全、方便 folder Path(folder_path) # 定义支持的图片后缀不区分大小写 image_extensions {.jpg, .jpeg, .png, .gif, .bmp, .webp} # 获取文件夹内所有文件路径并过滤出图片文件 # 使用 folder.glob(*) 获取所有项然后判断是文件且后缀在集合中 image_files [] for item in folder.iterdir(): if item.is_file() and item.suffix.lower() in image_extensions: image_files.append(item) # 按文件的修改时间进行排序保证重命名顺序可预期 image_files.sort(keylambda x: x.stat().st_mtime) # 开始重命名 for index, image_path in enumerate(image_files, start1): # 生成新文件名如产品图_001.jpg # :03d 表示格式化为3位数字不足补零 new_name f{prefix}_{index:03d}{image_path.suffix} new_path image_path.parent / new_name # 执行重命名 try: image_path.rename(new_path) print(f成功: {image_path.name} - {new_name}) except Exception as e: print(f失败: 重命名 {image_path.name} 时出错 - {e}) # 使用示例 if __name__ __main__: # 替换为你的实际文件夹路径 batch_rename_images(rD:\我的图片\待处理产品图)关键点与避坑排序的重要性如果不排序os.listdir或Path.iterdir返回的文件顺序是不确定的重命名后的序列会是乱的。按修改时间 (st_mtime) 或创建时间 (st_ctime) 排序是常见需求。后缀名处理文件后缀名可能大小写混用.JPG和.jpg用.lower()统一转为小写再判断更健壮。使用PathlibPython 3.4 推荐使用pathlib模块处理路径它用面向对象的方式比旧的os.path拼接字符串更直观、更安全能自动处理不同操作系统的路径分隔符问题。异常处理重命名操作可能因为文件被占用、权限不足等原因失败。用try...except捕获异常并打印错误信息可以让脚本不至于因为一个文件出错而完全停止也方便你排查问题。4.2 场景二从网页抓取数据并保存到Excel需求每天需要从某个新闻网站抓取当天的头条新闻标题和链接整理成表格存档。思路拆解使用requests库获取网页HTML内容。使用BeautifulSoup库解析HTML定位到新闻标题和链接所在的标签。提取数据并组织成列表或字典。使用pandas将数据创建为DataFrame并保存为Excel文件。代码实现与详解import requests from bs4 import BeautifulSoup import pandas as pd from datetime import datetime import time def fetch_news_to_excel(url, output_filenews.xlsx): 从指定URL抓取新闻数据并保存到Excel。 Args: url (str): 目标新闻网站的URL。 output_file (str): 输出的Excel文件名。 # 1. 设置请求头模拟浏览器访问避免被简单的反爬机制屏蔽 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 } try: print(f正在抓取: {url}) response requests.get(url, headersheaders, timeout10) # 设置超时时间 response.raise_for_status() # 如果状态码不是200抛出异常 response.encoding response.apparent_encoding # 自动识别编码 except requests.exceptions.RequestException as e: print(f网络请求失败: {e}) return # 2. 使用BeautifulSoup解析HTML soup BeautifulSoup(response.text, html.parser) # 3. 定位数据。这里需要你手动分析目标网页结构。 # 假设新闻标题在 h2 classnews-title 标签内链接在其中的a标签里 # 你需要使用浏览器的开发者工具F12查看实际结构并调整下面的选择器 news_list [] # 示例选择器请根据实际网页修改 news_items soup.find_all(div, class_news-item) for item in news_items: title_tag item.find(h2, class_news-title) link_tag item.find(a) if title_tag else None if title_tag and link_tag: title title_tag.get_text(stripTrue) # 获取文本并去除首尾空格 link link_tag.get(href) # 处理相对链接 if link and not link.startswith((http://, https://)): link requests.compat.urljoin(url, link) news_list.append({ 标题: title, 链接: link, 抓取时间: datetime.now().strftime(%Y-%m-%d %H:%M:%S) }) if not news_list: print(未找到新闻数据请检查选择器是否正确。) return # 4. 使用pandas保存数据 df pd.DataFrame(news_list) try: # modea 表示追加如果文件存在则在后面添加headerFalse 表示不写列名如果追加 # 这里我们简单覆盖写入。对于每日任务你可能需要更复杂的逻辑如追加到同一文件的不同sheet df.to_excel(output_file, indexFalse) print(f数据已成功保存到 {output_file}共 {len(df)} 条记录。) except Exception as e: print(f保存Excel文件失败: {e}) # 使用示例 if __name__ __main__: target_url https://example-news-site.com/headlines # 替换为实际网址 fetch_news_to_excel(target_url, 今日头条新闻.xlsx) # 可以在这里结合 schedule 库或系统定时任务实现每日自动抓取关键点与避坑反爬虫策略直接使用requests.get而不设置User-Agent很容易被网站识别为爬虫并拒绝访问。模拟一个常见浏览器的User-Agent是基本操作。更复杂的网站可能需要处理Cookie、Session甚至使用selenium/playwright来绕过JavaScript渲染。网页结构分析这是爬虫最核心也最易变的部分。必须使用浏览器的“开发者工具”F12在“元素”Elements选项卡中仔细查看目标数据所在的HTML标签结构。find_all和find方法以及CSS选择器 (select) 是你的主要工具。网站改版后选择器很可能失效脚本需要同步更新。链接处理抓取到的链接很可能是相对路径如/news/123需要拼接上网站的根域名才能形成完整的URL。requests.compat.urljoin可以很好地处理这个问题。伦理与法律务必遵守网站的robots.txt协议尊重版权不要对目标网站造成访问压力可在请求间添加time.sleep间隔。仅将数据用于个人学习或分析勿用于商业用途或侵犯他人权益。4.3 场景三自动发送邮件带附件需求每周五下午自动将生成的数据报告Excel文件通过邮件发送给团队成员。思路拆解使用smtplib和email库来构建和发送邮件。配置发件人邮箱的SMTP服务器信息如smtp.163.com, smtp.qq.com。构建邮件内容主题、正文、附件。连接服务器登录发送邮件。代码实现与详解import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from pathlib import Path def send_email_with_attachment(smtp_server, smtp_port, sender_email, sender_password, receiver_emails, subject, body, attachment_paths): 发送带附件的邮件。 Args: smtp_server (str): SMTP服务器地址如 smtp.163.com smtp_port (int): SMTP服务器端口如 465 (SSL) 或 587 (STARTTLS) sender_email (str): 发件人邮箱地址 sender_password (str): 发件人邮箱授权码注意不是登录密码 receiver_emails (list): 收件人邮箱地址列表 subject (str): 邮件主题 body (str): 邮件正文纯文本 attachment_paths (list): 附件文件路径列表 # 1. 创建邮件对象 msg MIMEMultipart() msg[From] sender_email msg[To] , .join(receiver_emails) # 多个收件人用逗号分隔 msg[Subject] subject # 2. 添加邮件正文 msg.attach(MIMEText(body, plain, utf-8)) # plain表示纯文本也可用html发送HTML邮件 # 3. 添加附件 for file_path in attachment_paths: path Path(file_path) if path.is_file(): with open(path, rb) as f: part MIMEApplication(f.read(), Namepath.name) # 定义附件的头部信息 part[Content-Disposition] fattachment; filename{path.name} msg.attach(part) print(f已添加附件: {path.name}) else: print(f警告: 附件文件不存在 - {file_path}) # 4. 连接服务器并发送邮件 try: # 根据端口选择加密方式。465端口通常使用SSL587端口使用STARTTLS。 if smtp_port 465: server smtplib.SMTP_SSL(smtp_server, smtp_port) else: server smtplib.SMTP(smtp_server, smtp_port) server.starttls() # 升级为加密连接 server.login(sender_email, sender_password) server.sendmail(sender_email, receiver_emails, msg.as_string()) server.quit() print(邮件发送成功) except Exception as e: print(f邮件发送失败: {e}) # 使用示例 if __name__ __main__: # --- 配置信息 (务必修改为你的信息) --- # 以163邮箱为例QQ邮箱类似服务器地址和端口不同 SMTP_SERVER smtp.163.com SMTP_PORT 465 # 163邮箱的SSL端口 SENDER_EMAIL your_email163.com # 注意这里填的是“授权码”不是邮箱登录密码 # 需要在邮箱设置中开启SMTP服务并获取授权码。 SENDER_PASSWORD your_authorization_code RECEIVER_EMAILS [colleague1company.com, colleague2company.com] EMAIL_SUBJECT 【自动化周报】销售数据汇总 - 2024年X月第X周 EMAIL_BODY 各位同事大家好 这是由自动化脚本生成的本周销售数据汇总报告请查收附件。 主要数据摘要 - 本周总销售额XXX元 - 环比增长X% - 详情请见附件Excel文件。 祝周末愉快 本邮件为自动发送请勿直接回复 ATTACHMENT_PATHS [./本周销售报告.xlsx, ./数据趋势图.png] # 附件路径列表 # 发送邮件 send_email_with_attachment( SMTP_SERVER, SMTP_PORT, SENDER_EMAIL, SENDER_PASSWORD, RECEIVER_EMAILS, EMAIL_SUBJECT, EMAIL_BODY, ATTACHMENT_PATHS )关键点与避坑授权码不是密码这是最大的坑几乎所有主流邮箱163 QQ Gmail等为了安全都不允许直接用登录密码在第三方客户端或脚本中登录SMTP服务器。你必须登录网页版邮箱在“设置”-“POP3/SMTP/IMAP”里开启SMTP服务并获取一个专用的“授权码”。这个授权码就是上面代码中的SENDER_PASSWORD。端口与加密方式不同邮箱的SMTP服务器地址和端口不同。常见组合163邮箱:smtp.163.com, 端口 465 (SSL) 或 994 (SSL)。QQ邮箱:smtp.qq.com, 端口 465 (SSL) 或 587 (STARTTLS)。Gmail:smtp.gmail.com, 端口 465 (SSL) 或 587 (STARTTLS)。 如果使用465端口就用SMTP_SSL如果使用587端口就先建立普通连接再starttls()。附件大小限制邮件服务器对附件大小通常有限制如25MB。发送大文件时需要考虑分卷压缩或使用云存储链接。HTML正文如果你想发送更美观的邮件可以将MIMEText(body, plain, utf-8)中的plain改为html并将body变量赋值为HTML格式的字符串。5. 进阶之路脚本的健壮性、可维护性与部署当你已经能写出完成基本功能的脚本后下一步就是让它们变得更可靠、更容易管理和长期运行。5.1 错误处理与日志记录一个在你自己电脑上运行良好的脚本放到服务器上可能因为文件权限、网络波动、数据格式变化而崩溃。完善的错误处理和日志是自动化脚本工业化的标志。使用Try-Except捕获特定异常 不要只用except Exception应该尽可能捕获具体的异常类型并做出不同的处理。try: df pd.read_excel(data.xlsx) # 后续处理... except FileNotFoundError: print(错误未找到数据文件 data.xlsx请检查路径。) # 可以在这里尝试创建默认文件或发送警报邮件 except pd.errors.EmptyDataError: print(错误数据文件为空。) except Exception as e: print(f处理数据文件时发生未知错误: {e}) # 记录详细的错误信息便于排查 import traceback traceback.print_exc()使用Logging模块记录日志 用print输出信息只适合临时调试。正式的脚本应该使用logging模块它可以方便地控制日志级别DEBUG, INFO, WARNING, ERROR、输出到文件、并格式化时间。import logging # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(auto_script.log), # 输出到文件 logging.StreamHandler() # 同时输出到控制台 ] ) logger logging.getLogger(__name__) def main_task(): logger.info(开始执行自动化任务...) try: # 你的核心代码 logger.debug(正在读取配置文件...) # ... logger.info(任务执行成功) except Exception as e: logger.error(f任务执行失败错误信息: {e}, exc_infoTrue) # exc_infoTrue会记录异常堆栈 if __name__ __main__: main_task()这样无论脚本在何时何地运行你都可以在auto_script.log文件中查看完整的历史记录对于排查半夜出错的定时任务尤其有用。5.2 配置与敏感信息管理你的脚本里不应该直接写入邮箱密码、API密钥、数据库连接字符串等敏感信息。这些信息应该从外部配置文件或环境变量中读取。使用配置文件如config.ini或config.yaml# config.ini 文件内容 # [email] # sender your_email163.com # auth_code your_auth_code_here # smtp_server smtp.163.com import configparser config configparser.ConfigParser() config.read(config.ini) sender config[email][sender] auth_code config[email][auth_code] # ... 使用这些变量记得将config.ini添加到.gitignore文件中避免将敏感信息提交到代码仓库。使用环境变量 在运行脚本前在终端中设置环境变量或在服务器、任务计划程序中设置。# Linux/Mac export EMAIL_PASSWORDyour_auth_code # Windows (命令行) set EMAIL_PASSWORDyour_auth_code在Python脚本中读取import os auth_code os.environ.get(EMAIL_PASSWORD) if not auth_code: raise ValueError(请设置环境变量 EMAIL_PASSWORD)5.3 将脚本打包与部署当你需要把脚本分享给不会编程的同事或者部署到没有Python环境的服务器时打包成可执行文件.exe是个好办法。使用PyInstallerPyInstaller可以将Python脚本及其所有依赖打包成一个独立的可执行文件。安装pip install pyinstaller打包在脚本所在目录打开命令行执行pyinstaller --onefile --windowed your_script.py--onefile将所有文件打包成一个exe。--windowed如果是GUI程序或不想显示命令行窗口加上这个选项。对于后台运行的命令行脚本可以不加。打包完成后在dist文件夹里就能找到your_script.exe文件。你可以直接把这个文件发给别人运行。部署到服务器 对于需要7x24小时运行的定时任务Linux服务器是更稳定的选择。将你的脚本和虚拟环境或使用pip freeze requirements.txt生成依赖列表上传到服务器。然后使用cron设置定时任务。记得在脚本中配置好绝对路径并使用前面提到的日志模块方便远程查看运行状态。自动化不是一蹴而就的魔法而是一个不断将手动过程抽象、固化为代码的思维习惯。最好的学习方式就是从你手头最烦人的那个重复任务开始尝试用Python去描述它。一开始可能会慢会遇到各种报错但每解决一个你就解锁了一项新技能。当第一个脚本成功运行替你完成那枯燥的半小时工作时那种成就感和解放感就是学习Python自动化最好的回报。