写给前端的 python 开发指南(掌握13个技能)
  54dOWncTgtsZ 2023年11月28日 26 0

前言

最初学习 python 是为了做一个客户端软件,里面涉及了手机控制自动化、文件批处理、客户端界面等,这个过程中接触和踩了很多坑,当然学到新技能总是能给人带来喜悦和成就感,在这个过程中我真的觉得 python 好有用;

比如说办公自动化,一个包含几百条图片链接的 excel, 如果要将其中图片一一下载下来,手动操作最少2小时,再好的脾气估计也要爆了,这时候用 python 执行,1-2 分钟,就搞定了,再顺带排个序,命个名都不在话下,是不是幸福感油然而生, 而代码只有 10 几行;

这只是小小的案例,如果你对 python 感兴趣的话,就开始我们的正文学习吧。

写给前端的 python 开发指南(掌握13个技能)_后端

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.")

一、需求点梳理

  1. excel 读取海量用户数据, 转化为序列化 json 数据
  2. 数据分析、保存
  3. pc 通过数据线控制手机自动化操作, 如控制支付宝批量转账操作等
  4. weditor 进行类似 web的 devTools,选择元素操作
  5. 产品化:gui 界面,封装 连接设备、选择文件、选择任务、执行、停止等功能
  6. 打包、逆向、加密

二、推荐 python 开发用的编辑器

写 python 代码可选择 vscode 结合插件(python),或者 pycharm 作为写 Python 代码的编辑器, 个人觉得写 demo 可以用 vscode, 轻量方便,写项目还是用 pycharm 比较合适, 详情讨论可参考 开发python用vs code 还是pycharm?

写给前端的 python 开发指南(掌握13个技能)_后端_02

写给前端的 python 开发指南(掌握13个技能)_前端_03

Pycharm 购买或者激活方法可参考:

  1. www.ajihuo.com/pycharm/419…
  2. idea.javatiku.cn/

本文后面默认使用 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 卸载版本

更多:pyenv 介绍、安装、使用方法

四、项目搭建-依赖包管理

写给前端的 python 开发指南(掌握13个技能)_Python_04

关于什么是虚拟环境?为什么用虚拟环境?什么是 pip ?等,同样可回顾这篇文章 python 入门系列文章 - 环境搭建

不论什么虚拟环境,如 venv 还是 virtualenv,开发的时候都不用把依赖包 push 到远程, 直接把包定义到 requirements.txt 文件中(类似前端的 package.json),迁移环境时候使用命令重新安装包,这样就不限制固定的虚拟环境类型了;

具体步骤:

  1. 生成 requirements.txt 文件, 用于记录所有依赖包及其精确的版本号
pip freeze > requirements.txt
  1. 迁移到新位置,先创建一个新的虚拟环境,并激活
  2. 还原安装依赖包
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 // 启动,会开启一个本地端口,并打开浏览器操作页面

写给前端的 python 开发指南(掌握13个技能)_前端_05

下面以钉钉登录为例示范下 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 自动化控制,官方介绍如下:

写给前端的 python 开发指南(掌握13个技能)_后端_06

# 安装
pip install uiautomator2

通过 adb 来获取当前 usb 连接的手机设备编号,需要开启开发者选项和一些权限,详细流程可参考 # Mac电脑下通过 ada + atx-agent 连接安卓手机流程

# 基本使用
import uiautomator2 as u2

# 连接手机
d = u2.connect("手机编号")

# 打开被测试应用,如微信
d.app_start('com.tencent.mm')

更多:

  1. 入门教程
  2. uiautomator2 常用 api
  3. 官方文档

八、读写 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 开发指南(掌握13个技能)_数据_07

写给前端的 python 开发指南(掌握13个技能)_python_08

图片来源:可能是全网最完整的 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 开发指南(掌握13个技能)_前端_09

九、python 图形界面库的选择 PyQt6 | PySide6

直接说结论:

建议不要用python 环境自带的 Tkinter, 直接用 PyQt

Tkinter 唯一的优势就是系统自带,不用安装第三方包;

PyQt 很强大,可以对接 C++, 嵌套 web 页面;

PySide 是 PyQt 的官方开源版本,语法几乎一样,更推荐;

写给前端的 python 开发指南(掌握13个技能)_数据_10

更多:

  1. 为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?
  2. PyQt 入门教程

十、PyQt6 | PySide6 的环境配置

pyside-designerPyQt 的界面设计程序,使用拖拽的形式设计界面并保存为 .ui 格式的文件;

pyside-uic 可以将 pyside-designer 设计的 .ui 文件转译为 .py 格式的文件;

以 macOs 为例

# 安装
pip install pyside6
pip install pyside6-uic

# 转译指令
pyside6-uic -o xxx.py xxx.ui

这两个包安装完后,位置如下:

写给前端的 python 开发指南(掌握13个技能)_后端_11

可以双击打开,不过更合适的形式是配置到 pyCharm 里,像这样

写给前端的 python 开发指南(掌握13个技能)_后端_12

写给前端的 python 开发指南(掌握13个技能)_数据_13

Pycharm 配置 PySide6 的方法:

  1. 打开 Pycharm 设置界面
  2. 点击外部工具
  3. Qt Designer: 填写名称、程序位置、实参:不填、工作目录: 如图为项目所在文件夹pyUIC: 填写名称、程序位置、实参$FileNameWithoutExtension$.py、工作目录写 $FileDir$

更多:

  1. Pycharm安装配置Pyside6
  2. macOS 使用 Qt Designer + pyUIC 完成一个小工具
  3. PySide6、PyQt6、ui文件转py文件、Qt Designer 使用

十一、用 PyInstaller 进行打包

PyInstaller 是一个用于将 Python 脚本打包成可执行文件的工具,简单的说,就是可以用 PyInstaller 将 python 脚本打包成 window 或者 mac 上的应用程序,这样你就可以将其发送给其他人,而不需要他们事先安装 Python 环境。

# 通过 pip 安装
pip install pyinstaller

# 基本打包指令
pyinstaller your_script.py

打包成功后,会生成 dist 文件夹,里面的 app 文件就是可执行的应用程序了,对应window 平台的 exe 程序。

写给前端的 python 开发指南(掌握13个技能)_前端_14

常用配置

PyInstaller 在打包时提供了许多配置选项,以便根据你的需求进行定制。以下是一些常用的 PyInstaller 打包配置项:

  1. -F--onefile: 将所有的依赖项打包成一个单独的可执行文件,而不是生成一个文件夹。这有助于简化分发和部署。pyinstaller -F your_script.py
  2. -w--windowed: 在 Windows 上,这将使生成的可执行文件不显示控制台窗口。对于 GUI 应用程序很有用。pyinstaller -w your_script.py
  3. --noconsole: 这与 -w 类似,但它在所有平台上都适用。用于禁用控制台窗口的显示。
  4. --icon=<icon_file>: 指定一个图标文件,该图标将用作生成的可执行文件的图标。
  5. --name=<name>: 指定生成的可执行文件的名称。
  6. --hidden-import=<module_name>: 如果你的脚本使用了某个模块,但 PyInstaller 未能自动检测到,你可以使用此选项显式指定该模块。
  7. --add-data--add-binary: 用于添加额外的数据文件或二进制文件到打包后的可执行文件中。
  8. --exclude-module: 用于排除特定模块,以避免其被包含在生成的可执行文件中。
  9. --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 一样,是用户是没有秘密可言的。

基本流程

  1. pyinstxtractor 用来解包,将 exe 文件解压成 pyc 文件
  2. 利用 uncompyle6 对 pyc文件进行反编译(也就是重新编译回 py 文件)
Python pyinstxtractor.py 易选宝.exe
uncompyle6 login.pyc>login.py

完整流程可参考:将python打包后的exe还原成py

十三、怎么防止逆向

理论上防止不了,但是可以通过一些手段,对代码打包时进行一些加密操作,增加逆向的成本;

  1. 安装 pycrypto
  2. 使用 pyinstaller加密打包
pyinstaller.exe -F --key 123456 xxx.py

关于这块可以看看这两篇文章:

谈谈 Pyinstaller 的编译和反编译,如何保护你的代码

怎么样打包 pyqt 应用才是最佳方案?或者说 pyqt 怎样的发布方式最优?

总结

以上内容源于我过去一段时间的 python 笔记,相信如果你也在做python 客户端开发、自动化相关的产品,肯定会用到这些知识的。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月28日 0

暂无评论

推荐阅读
54dOWncTgtsZ