利用 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
print("执行了 my_package.py")

接下来再编写 sitecustomize.py 文件,在这个文件中导入这个 Python 文件。

1
import my_package

import 的一些用法

关于 Python 的 import 用法可以看看这个视频:【python】关于import你需要知道的一切!一个视频足够了 - 哔哩哔哩/码农高天

现在这个目录的文件结构是这样的。

1
2
3
4
5
6
$ tree D:/Downloads/my_modules
D:/Downloads/my_modules
├── my_package.py
└── sitecustomize.py

1 directory, 2 files

接下来就是通过 PYTHONPATH 环境变量去指定这个目录。

1
export PYTHONPATH="D:/Downloads/my_modules"

关于 PYTHONPATH 的一些重要东西

  1. 这里是在 Windows 系统上使用 Msys2 终端进行演示的,这个设置环境变量的命令和在 Linux / MacOS 上一致。如果是在 Windows 系统上的 PowerShell / CMD 上设置环境变量,命令需要改一下呢。
  • PowerShell
1
$Env:PYTHONPATH = "D:/Downloads/my_modules"
  • CMD
1
set "PYTHONPATH=D:/Downloads/my_modules"
  1. 如果需要在 PYTHONPATH 环境变量中指定多个路径,比如指定D:/Downloads/my_modulesD:/Sofowares/my_app,可以使用路径分隔符对多个路径进行分隔。
1
export PYTHONPATH="D:/Downloads/my_modules;D:/Sofowares/my_app"

注意,在 Windows 系统上,路径分隔符为;,在 Linux / MacOS 系统上路径分隔符为:

这些步骤都做完后,来试试效果吧,接下来尝试启动 Python 交互式终端和使用 Python 解释器执行一个 Python 脚本(test_1.py 脚本中的代码为print("执行我的 test_1.py 文件"))。

1
2
3
4
5
6
7
8
9
$ python
执行了 my_package.py
Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

$ python test_1.py
执行了 my_package.py
执行我的 test_1.py 文件

是不是很神奇呢?在启动 Python 交互式终端和使用 Python 解释器执行一个 Python 脚本时,前面编写好的需要自动执行的代码就被自动执行了,通过这种方式,可以在自动执行的代码文件中编写 Monkey Patch,在不修改 Python 原程序的前提下实现对 Python 程序的修改,很高级的玩法喵。

实战: 使用 S3impleClient 的补丁

S3impleClient 可以对 HuggingFace Library 的上传和下载功能进行补丁,加速上传和下载。

使用 Pip 安装一下 S3impleClient。

1
pip install s3impleclient

安装完成后创建一个存放自动执行 Python 代码的目录,比如D:/Downloads/my_patcher,在目录中编写一个 s3c_patcher.py 文件,代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
import os


def apply_s3c_patch() -> None:
"""应用 S3impleClient 补丁"""
try:
import s3impleclient as s3c
s3c.patch_all()
os.environ["HF_HUB_DISABLE_XET"] = "1"
except ImportError:
print("导入 S3impleClient 模块发生出错, 请尝试使用 pip install s3impleclient 命令进行修复")
except Exception as e:
print(f"应用 S3impleClient 补丁时发生未知出错: {e}")

再编写 sitecustomize.py 文件,在这个文件中从 s3c_patcher.py 导入 apply_s3c_patch 函数并应用。

1
2
3
4
from s3c_patcher import apply_s3c_patch


apply_s3c_patch()

此时的目录结构如下。

1
2
3
4
5
6
$ tree D:/Downloads/my_patcher
D:/Downloads/my_patcher
├── s3c_patcher.py
└── sitecustomize.py

1 directory, 2 files

最后再设置 PYTHONPATH 环境变量,指定刚刚的D:/Downloads/my_patcher目录。

1
export PYTHONPATH="D:/Downloads/my_patcher"

此时就完成补丁的配置了,当执行 Python 脚本或者运行 Python 解释器时,S3impleClient 的补丁就会自动应用。

自动执行 Python 代码的一些注意点

上面的演示中设置 PYTHONPATH 环境变量的命令只会临时生效的呢,如果重新打开终端就需要重新设置 PYTHONPATH 环境变量了,如果需要自动设置这个 PYTHONPATH 环境变量,可以配置一下终端配置文件,在配置文件中自动执行配置 PYTHONPATH 环境变量的命令。

比如 PowerShellMicrosoft.PowerShell_profile.ps1Bash.bashrcZsh.zshrc,怎么配置就问问 AI 吧,这里就不展开说说了。


利用 sitecustomize 与 PYTHONPATH 在 Python 中实现自动执行代码
https://licyk.netlify.app/2025/12/18/auto-execution-with-sitecustomize-and-pythonpath-in-python/
作者
licyk
发布于
2025年12月18日
许可协议