前言
最初学习 python 是为了做一个客户端软件,里面涉及了手机控制自动化、文件批处理、客户端界面等,这个过程中接触和踩了很多坑,当然学到新技能总是能给人带来喜悦和成就感,在这个过程中我真的觉得 python 好有用;
比如说办公自动化,一个包含几百条图片链接的 excel, 如果要将其中图片一一下载下来,手动操作最少2小时,再好的脾气估计也要爆了,这时候用 python 执行,1-2 分钟,就搞定了,再顺带排个序,命个名都不在话下,是不是幸福感油然而生, 而代码只有 10 几行;
这只是小小的案例,如果你对 python 感兴趣的话,就开始我们的正文学习吧。
import requests
import os
# 读取excel 文件数据,解析到 url_list
url_list = [xxx]
# 创建存储图片的文件夹
os.makedirs("img", exist_ok=True)
for i, url in enumerate(url_list):
response = requests.get(url)
if response.status_code == 200:
with open(f"img/image_{i}.jpg", "wb") as f:
f.write(response.content)
print(f"Image {i} downloaded successfully.")
else:
print(f"Failed to download image {i}.")
print("All images downloaded.")
一、需求点梳理
- excel 读取海量用户数据, 转化为序列化 json 数据
- 数据分析、保存
- pc 通过数据线控制手机自动化操作, 如控制支付宝批量转账操作等
- weditor 进行类似 web的 devTools,选择元素操作
- 产品化:gui 界面,封装 连接设备、选择文件、选择任务、执行、停止等功能
- 打包、逆向、加密
二、推荐 python 开发用的编辑器
写 python 代码可选择 vscode
结合插件(python),或者 pycharm
作为写 Python 代码的编辑器, 个人觉得写 demo 可以用 vscode, 轻量方便,写项目还是用 pycharm 比较合适, 详情讨论可参考 开发python用vs code 还是pycharm?
Pycharm 购买或者激活方法可参考:
本文后面默认使用 pycharm。
三、多 python 版本管理
Mac 上默认系统自带的 Python 版本是 2.x, 而现在用的比较多的都已经是 3.x 了,建议使用 pyenv
这个工具来安装和管理多个Python 版本,类似于前端的 nvm 或者 n 来管理 node 版本一样。
安装
brew install pyenv # 会比较慢 耐心
修改环境变量
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PATH="$PYENV_ROOT/shims:$PATH"
if which pyenv > /dev/null;
then eval "$(pyenv init -)";
fi
# “注意:根据下载的 pyenv 版本不同,目录为 shims 或 bin(export PATH="$PYENV_ROOT/bin:$PATH"),若切换不生效,可以 check 一下这里是否写的不一致,建议两种写法都写上”
source ~/.zshrc
使用
pyenv --version 查看 pyenv 当前版本
pyenv version 查看当前 python 版本
pyenv versions 查看当前已安装的所有 python 版本
pyenv install --list 查看远程可安装的所有 python 版本
pyenv install 3.9.16(版本号) 安装指定版本的 python
pyenv global 版本号 全局更改 python 默认版本, 对所有的 Shell 全局有效,会把版本号写入到~/.pyenv/version文件中
pyenv uninstall 3.9.16 卸载版本
四、项目搭建-依赖包管理
关于什么是虚拟环境?为什么用虚拟环境?什么是 pip
?等,同样可回顾这篇文章 python 入门系列文章 - 环境搭建
不论什么虚拟环境,如 venv 还是 virtualenv,开发的时候都不用把依赖包 push 到远程, 直接把包定义到 requirements.txt
文件中(类似前端的 package.json
),迁移环境时候使用命令重新安装包,这样就不限制固定的虚拟环境类型了;
具体步骤:
- 生成 requirements.txt 文件, 用于记录所有依赖包及其精确的版本号
pip freeze > requirements.txt
- 迁移到新位置,先创建一个新的虚拟环境,并激活
- 还原安装依赖包
pip install -r requirements.txt
参数 -r
用于指定一个文本文件,该文件列出了要安装的依赖项列表,-r
的含义是 "requirements",用于表示依赖项列表文件。
即 pip install -r
命令会一次性安装 requirements.txt 文件里面列出需要安装的库,如果没有 -r 则会将 requirements.txt 当成一个包来安装。
其他注意点
python -m pip freeze requirements # 查看 requirements 下
pip show uiautomator2 # 查看当前环境是否安装了 uiautomator2 包
五、内置变量、内置函数、内置模块
print(vars())
可以打印出 python 所有的内置变量。
1、__name__
: 可判断当前脚本是直接执行的,还是被导入其他程序执行的:
最常见的如在一个 .py 文件底部,经常有这样一段代码:
def myFunction():
print('变量 __name__ 的值是 ' + __name__)
def main():
myFunction()
if __name__ == '__main__':
main()
当你直接执行一段脚本的时候,这段脚本的 name变量等于 'main';
当这段脚本被导入其他程序的时候,name 变量等于脚本本身的名字。参考更多
2、print(__file__)
返回当前文件的路径,一般配合 os 模块的 os.path.dirname()
,os.path.basename()
,os.path.join()
模块函数来使用
3、print(__package__)
,获取导入文件的路径,多层目录以点分割,注意:对当前文件返回None
4、__builtins__
是一个包含内置命名空间的模块对象,它允许你直接访问 Python 内置的函数
# 打印内置函数列表
builtin_functions = dir(__builtins__)
print("常见的内置函数:")
for func in builtin_functions:
if callable(getattr(__builtins__, func)):
print(func)
# 使用内置函数
num = -10
abs_num = __builtins__.abs(num)
print(f"绝对值: {abs_num}")
text = "Hello, Python!"
print(__builtins__.len(text))
num_list = [1, 2, 3, 4, 5]
sum_nums = __builtins__.sum(num_list)
print(f"列表元素和: {sum_nums}")
5、python 还提供了很多内置的模块,可以直接使用。
math: 提供了数学运算的函数和常量,如三角函数、对数、幂等。
random: 用于生成随机数和随机选择。
datetime: 用于处理日期和时间,包括日期计算、格式化等。
time: 提供与时间相关的功能,如获取当前时间、睡眠等。
os: 与操作系统交互的模块,提供文件、目录操作等功能。
sys: 提供了与 Python 解释器交互的函数和变量,如命令行参数、退出程序等。
json: 用于处理 JSON 格式的数据。
csv: 用于处理逗号分隔值(CSV)文件。
re: 用于正则表达式操作。
urllib: 用于处理 URL 和进行网络请求。
email: 用于发送和接收电子邮件。
xml: 用于处理 XML 数据。
sqlite3: 用于操作 SQLite 数据库。
collections: 提供了一些有用的数据类型,如命名元组、计数器等。
itertools: 提供了用于创建和操作迭代器的函数。
functools: 提供了一些高阶函数,如部分应用函数、缓存等。
logging: 用于记录日志信息。
argparse: 用于解析命令行参数。
gzip: 用于处理压缩文件。
socket: 用于网络编程。
六、weditor 来定位元素
weditor 是一款基于浏览器的 UI 查看器,用来帮助我们查看 UI 元素定位
pip install weditor
weditor -v // 查看是否安装成功
python -m weditor // 启动,会开启一个本地端口,并打开浏览器操作页面
下面以钉钉登录为例示范下 weditor 的基本用法:
def login(d):
print('输入账号')
d(resourceId="com.alibaba.android.rimet:id/et_phone_input").click()
time.sleep(0.5)
print("输入密码")
d(resourceId="com.alibaba.android.rimet:id/et_password").click()
d(resourceId="com.alibaba.android.rimet:id/et_password").clear_text() # 这里是清除指定元素的内容
time.sleep(0.5)
# 检查是否需要勾选服务协议,如果需要,则进行勾选操作
agreement_checkbox = d(resourceId="com.alibaba.android.rimet:id/cb_privacy")
if agreement_checkbox.exists and not agreement_checkbox.info['selected']:
print("勾选协议")
agreement_checkbox.click()
print("登录")
d(resourceId="com.alibaba.android.rimet:id/btn_next").click()
七、uiautomator2 实现手机自动化控制
uiautomator2
是一个基于 python 的工具库,可以通过它对安卓设备进行 UI 自动化控制,官方介绍如下:
# 安装
pip install uiautomator2
通过 adb
来获取当前 usb 连接的手机设备编号,需要开启开发者选项和一些权限,详细流程可参考 # Mac电脑下通过 ada + atx-agent 连接安卓手机流程
# 基本使用
import uiautomator2 as u2
# 连接手机
d = u2.connect("手机编号")
# 打开被测试应用,如微信
d.app_start('com.tencent.mm')
更多:
八、读写 Excel 文件、数据分析|处理
python 中能操作 Excel 的库有很多,下面的表格列出了常见的一些和基本对比,其中xlrd、xlwt 是python 环境自带的,只支持处理 xls 文件, xls 是 Excel2003 及以前版本生成的文件格式,而xlsx是Excel2007及以后版本生成的文件格式,如果要处理 xlsx 格式文件,则需要用第三方库,其中最推荐的是 Pandas 、openpyxl。
Pandas是一个功能强大的 数据分析库,它更擅长做数据分析、处理。
openpyxl 是一个用于读取、写入和操作 Excel 2010 (.xlsx) 文件的 Python 库;它允许你通过编程方式访问和处理 Excel 文件的各种元素,如工作簿、工作表、单元格、图表和图像等;可以说它更擅长做 Excel 读写。
在某些情况下,你可能需要将两者结合使用。例如,你可以使用 openpyxl
来打开和操作 Excel 文件,然后将数据读取到 pandas
的 DataFrame 中,以便进行更复杂的数据分析和处理;或者你可以使用 pandas
进行数据处理后,将结果写回到 Excel 文件中,这时可以使用 openpyxl
来实现更精细的格式控制。
各个库的基本对比情况:
图片来源:可能是全网最完整的 Python 操作 Excel库总结!
示范下 用 python 自带的 xlrd、xlwt
库怎么读写 Excel 来源:Python读写操作Excel数据详解:
import xlrd
import xlwt
def read_xls_excel(url, index):
# 读取xls格式文件
# 参数:
# url:文件路径
# index:工作表序号 (第几个工作表,传入参数从1开始数)返回:
# data:表格中的数据
# 打开指定的工作薄
workbook = xlrd.open_workbook(url)
# 获取工作薄中的所有表格
sheets = workbook.sheet_names( )
# 获取工作薄中所有表格中的的第 index 个表格
worksheet = workbook.sheet_by_name(sheets[index-1]) # 定义列表存储表格数据
data = []
print('源表共', worksheet.nrows - 2, '行数据')
# 遍历每一行数据
for i in range(0, worksheet.nrows): # 定义表格存储每一行数据
da = []
# 遍历每一列数据
for j in range(0, worksheet.ncols): # 将行数据存储到da列表
da.append(worksheet.cell_value(i, j)) # 存储每一行数据
data.append(da)
# 返回数据
return data
def write_xls_excel(url, sheet_name, two_dimensional_data):
# 写入xls格式文件
# 参数:
# url:文件路径
# sheet_name:表名
# two_dimensional data:将要写入表格的数据(二维列表)
# 创建工作薄对象
workbook = xlwt.Workbook( ) # 创建工作表对象
sheet = workbook.add_sheet(sheet_name) # 遍历每一行数据
for i in range(0, len(two_dimensional_data)):
# 遍历每一列数据
for j in range(0, len(two_dimensional_data[i])): # 写入数据
sheet.write(i, j, two_dimensional_data[i][j])
# 保存
workbook.save(url)
print("写入成功")
read_xls_excel 函数读取结果示例:
九、python 图形界面库的选择 PyQt6 | PySide6
直接说结论:
建议不要用python 环境自带的 Tkinter
, 直接用 PyQt
;
Tkinter 唯一的优势就是系统自带,不用安装第三方包;
PyQt 很强大,可以对接 C++, 嵌套 web 页面;
PySide 是 PyQt 的官方开源版本,语法几乎一样,更推荐;
更多:
十、PyQt6 | PySide6 的环境配置
pyside-designer
是 PyQt
的界面设计程序,使用拖拽的形式设计界面并保存为 .ui
格式的文件;
pyside-uic
可以将 pyside-designer 设计的 .ui
文件转译为 .py
格式的文件;
以 macOs 为例
# 安装
pip install pyside6
pip install pyside6-uic
# 转译指令
pyside6-uic -o xxx.py xxx.ui
这两个包安装完后,位置如下:
可以双击打开,不过更合适的形式是配置到 pyCharm 里,像这样
Pycharm 配置 PySide6 的方法:
- 打开 Pycharm 设置界面
- 点击外部工具
- Qt Designer: 填写名称、程序位置、实参:不填、工作目录: 如图为项目所在文件夹
pyUIC: 填写名称、程序位置、实参
$FileNameWithoutExtension$.py
、工作目录写$FileDir$
更多:
十一、用 PyInstaller 进行打包
PyInstaller 是一个用于将 Python 脚本打包成可执行文件的工具,简单的说,就是可以用 PyInstaller 将 python 脚本打包成 window 或者 mac 上的应用程序,这样你就可以将其发送给其他人,而不需要他们事先安装 Python 环境。
# 通过 pip 安装
pip install pyinstaller
# 基本打包指令
pyinstaller your_script.py
打包成功后,会生成 dist 文件夹,里面的 app 文件就是可执行的应用程序了,对应window 平台的 exe 程序。
常用配置
PyInstaller 在打包时提供了许多配置选项,以便根据你的需求进行定制。以下是一些常用的 PyInstaller 打包配置项:
-
-F
或--onefile
: 将所有的依赖项打包成一个单独的可执行文件,而不是生成一个文件夹。这有助于简化分发和部署。pyinstaller -F your_script.py
-
-w
或--windowed
: 在 Windows 上,这将使生成的可执行文件不显示控制台窗口。对于 GUI 应用程序很有用。pyinstaller -w your_script.py
-
--noconsole
: 这与-w
类似,但它在所有平台上都适用。用于禁用控制台窗口的显示。 -
--icon=<icon_file>
: 指定一个图标文件,该图标将用作生成的可执行文件的图标。 -
--name=<name>
: 指定生成的可执行文件的名称。 -
--hidden-import=<module_name>
: 如果你的脚本使用了某个模块,但 PyInstaller 未能自动检测到,你可以使用此选项显式指定该模块。 -
--add-data
和--add-binary
: 用于添加额外的数据文件或二进制文件到打包后的可执行文件中。 -
--exclude-module
: 用于排除特定模块,以避免其被包含在生成的可执行文件中。 -
--upx-dir=<path>
: 如果安装了 UPX 压缩工具,并且想要对生成的可执行文件进行压缩,可以使用此选项指定 UPX 工具的路径。
这只是一些常用的 PyInstaller 配置选项。在实际使用中,你可能需要根据你的项目需求进行更多的定制和调整。可以通过运行 pyinstaller --help
命令来查看所有可用的配置选项和其描述。
复杂情况
如果是复杂点的多文件项目,需要先生成 spec 文件,这个 .spec
文件包含了项目的配置信息,可以手动修改以定制打包过程。当你第一次运行 PyInstaller 时,它会自动生成一个默认的 .spec
文件,你可以在此基础上进行修改,或者使用 pyi-makespec 工具,pyi-makespec
是 PyInstaller 提供的一个命令行工具,用于生成 .spec
文件,该文件描述了如何将 Python 脚本转换为可执行文件。你可以在生成的 .spec
文件中配置各种选项,以满足你的项目需求。
使用方法:
pyi-makespec [options] your_script.py
这里是一些常用的选项:
--onefile
或-F
: 将所有的依赖项打包成一个单独的可执行文件。--noconsole
: 生成的可执行文件不会显示控制台窗口。--icon=<icon_file>
: 指定生成的可执行文件的图标。--add-data=<source>:<destination>
: 添加数据文件,将源文件复制到目标位置。--hidden-import=<module_name>
: 添加隐式依赖的模块。--name=<name>
: 指定生成的可执行文件的名称。--windowed
或-w
: 生成的可执行文件没有控制台窗口。--upx-dir=<path>
: 指定 UPX 压缩工具的路径。
需要注意的是,pyi-makespec
在生成 .spec
文件时,会尝试根据你的操作系统和 Python 环境自动添加一些默认配置。你可以在生成的 .spec
文件中找到这些默认配置,并根据需要进行修改。
十二、逆向
Python 是一种解释性语言,其源代码在运行之前会被编译成字节码(如 pyc 文件),然后由 Python 解释器执行。
pyc 是 py文件编译后的二进制文件,可以使用反汇编工具或反编译工具来还原出 Python 源代码的近似形式,所以说 python 程序和 javaScript 一样,是用户是没有秘密可言的。
基本流程
- pyinstxtractor 用来解包,将 exe 文件解压成 pyc 文件
- 利用 uncompyle6 对
pyc
文件进行反编译(也就是重新编译回 py 文件)
Python pyinstxtractor.py 易选宝.exe
uncompyle6 login.pyc>login.py
完整流程可参考:将python打包后的exe还原成py
十三、怎么防止逆向
理论上防止不了,但是可以通过一些手段,对代码打包时进行一些加密操作,增加逆向的成本;
-
安装
pycrypto
包 -
使用
pyinstaller
加密打包pyinstaller.exe -F --key 123456 xxx.py
关于这块可以看看这两篇文章:
谈谈 Pyinstaller 的编译和反编译,如何保护你的代码
怎么样打包 pyqt 应用才是最佳方案?或者说 pyqt 怎样的发布方式最优?
总结
以上内容源于我过去一段时间的 python 笔记,相信如果你也在做python 客户端开发、自动化相关的产品,肯定会用到这些知识的。
建了个技术讨论群,欢迎加入 wx: 1032151090;