利用 sitecustomize 与 PYTHONPATH 在 Python 中实现自动执行代码
本文最后更新于 2025年12月18日 晚上
前言
绘世启动器中拥有一个补丁系统,可以对 SD WebUI / ComfyUI 的功能进行修改,并且是在不修改源文件的条件下实现的。喵喵写的这系统真的好高级,自己就试着去研究这补丁系统是如何实现的了。
实现原理
绘世启动器的补丁系统主要的实现点就两个,一个是使用 Python 编写 Monkey Patch,这些 Monkey Patch 就是对 SD WebUI / ComfyUI 的功能进行修改;另一个是如何在执行 Python 解释器去运行 SD WebUI / ComfyUI 前,自动执行这些编写好的 Monkey Patch。
绘世启动器的 Monkey Patch 自己也没完全研究明白(截止至写这篇文章时),所以在这就不展开说明了。
而如何去自动执行 Monkey Patch,换句话来说就是自动执行一些 Python 代码,自己通过一些黑盒测试,还有些奇奇怪怪的方法,终于发现这是如何实现的了。实现其实很简单呢,就两个,sitecustomize 与 PYTHONPATH。
sitecustomize? PYTHONPATH? 这是什么?
Python 解释器在启动时,比如在启动 Python 交互式终端或者是执行一个 Python 脚本时,会自动导入一个名为 site 的模块,site 模块被导入后会执行一个操作,其中一个操作会尝试导入一个名为 sitecustomize 的模块。既然会自动导入 sitecustomize 这个模块,那通过编写 sitecustomize.py 文件就可以实现自动执行 Python 代码了呢。
Python 在导入模块时是在 sys.path 中搜寻要导入的模块,在这个变量中会存在多个路径,当搜索到匹配的模块时将执行导入操作,终止后续的搜寻。而这个路径是可以被修改的,可以通过sys.path.insert()/sys.path.append()方法进行路径添加,或者是通过 PYTHONPATH 环境变量进行路径添加。Python 解释器在启动时会将 PYTHONPATH 环境变量中的路径添加到 sys.path 中。
怎么玩呢?
知道了 sitecustomize 和 PYTHONPATH 的作用,实现自动执行 Python 代码的思路就很清晰了。
大致思路
先创建一个目录存放自己的 Python 代码,在这个目录中将需要自动执行的代码编写在 sitecustomize.py 文件中,或者在这个目录中编写一个 Python 文件,比如 my_package.py,然后编写 sitecustomize.py 文件,在这个文件中导入这个 my_package.py 文件,这样需要自动执行的 Python 代码就制作好了。接下来就通过 PYTHONPATH 环境变量去指定这个目录,注意要用绝对路径去指定。这样就实现启动 Python 解释器时自动执行准备好的 Python 代码了。
举个例子吧
光讲思路可能听不懂,所以就举个例子说明吧。
先创建一个目录用于存放需要自动执行的代码,比如D:/Downloads/my_modules,在目录下编写一个需要自动执行的 Python 代码,比如 my_package.py。
1 | |
接下来再编写 sitecustomize.py 文件,在这个文件中导入这个 Python 文件。
1 | |
import 的一些用法
关于 Python 的 import 用法可以看看这个视频:【python】关于import你需要知道的一切!一个视频足够了 - 哔哩哔哩/码农高天
现在这个目录的文件结构是这样的。
1 | |
接下来就是通过 PYTHONPATH 环境变量去指定这个目录。
1 | |
关于 PYTHONPATH 的一些重要东西
- 这里是在 Windows 系统上使用 Msys2 终端进行演示的,这个设置环境变量的命令和在 Linux / MacOS 上一致。如果是在 Windows 系统上的 PowerShell / CMD 上设置环境变量,命令需要改一下呢。
- PowerShell
1 | |
- CMD
1 | |
- 如果需要在 PYTHONPATH 环境变量中指定多个路径,比如指定
D:/Downloads/my_modules和D:/Sofowares/my_app,可以使用路径分隔符对多个路径进行分隔。
1 | |
注意,在 Windows 系统上,路径分隔符为;,在 Linux / MacOS 系统上路径分隔符为:。
这些步骤都做完后,来试试效果吧,接下来尝试启动 Python 交互式终端和使用 Python 解释器执行一个 Python 脚本(test_1.py 脚本中的代码为print("执行我的 test_1.py 文件"))。
1 | |
是不是很神奇呢?在启动 Python 交互式终端和使用 Python 解释器执行一个 Python 脚本时,前面编写好的需要自动执行的代码就被自动执行了,通过这种方式,可以在自动执行的代码文件中编写 Monkey Patch,在不修改 Python 原程序的前提下实现对 Python 程序的修改,很高级的玩法喵。
实战: 使用 S3impleClient 的补丁
S3impleClient 可以对 HuggingFace Library 的上传和下载功能进行补丁,加速上传和下载。
使用 Pip 安装一下 S3impleClient。
1 | |
安装完成后创建一个存放自动执行 Python 代码的目录,比如D:/Downloads/my_patcher,在目录中编写一个 s3c_patcher.py 文件,代码如下。
1 | |
再编写 sitecustomize.py 文件,在这个文件中从 s3c_patcher.py 导入 apply_s3c_patch 函数并应用。
1 | |
此时的目录结构如下。
1 | |
最后再设置 PYTHONPATH 环境变量,指定刚刚的D:/Downloads/my_patcher目录。
1 | |
此时就完成补丁的配置了,当执行 Python 脚本或者运行 Python 解释器时,S3impleClient 的补丁就会自动应用。
自动执行 Python 代码的一些注意点
上面的演示中设置 PYTHONPATH 环境变量的命令只会临时生效的呢,如果重新打开终端就需要重新设置 PYTHONPATH 环境变量了,如果需要自动设置这个 PYTHONPATH 环境变量,可以配置一下终端配置文件,在配置文件中自动执行配置 PYTHONPATH 环境变量的命令。
比如 PowerShell 的Microsoft.PowerShell_profile.ps1,Bash 的.bashrc,Zsh 的.zshrc,怎么配置就问问 AI 吧,这里就不展开说说了。