还是不死心,在接着想想。
第一次运行SD,根据webui-user的代码走一遍步骤:
-
定义路径
if not defined PYTHON (set PYTHON=python) if defined GIT (set "GIT_PYTHON_GIT_EXECUTABLE=%GIT%") # 所以一开始,只需要设置git这个参数? if not defined VENV_DIR (set "VENV_DIR=%~dp0%venv") set SD_WEBUI_RESTART=tmp/restart set ERROR_REPORTING=FALSE mkdir tmp 2>NUL
-
# 检查pyhton是否可用。安装时设置了python全局路径,所以可以运行 %PYTHON% -c "" >tmp/stdout.txt 2>tmp/stderr.txt if %ERRORLEVEL% == 0 goto :check_pip
-
# 检查pip。全局python路径下的scrips中有pip,可以运行 :check_pip %PYTHON% -mpip --help >tmp/stdout.txt 2>tmp/stderr.txt if %ERRORLEVEL% == 0 goto :start_venv
-
:start_venv if ["%VENV_DIR%"] == ["-"] goto :skip_venv # 第一次不运行 if ["%SKIP_VENV%"] == ["1"] goto :skip_venv # 第一次不运行 # 查看是否有\Scripts\Python.exe,第一次结果为没有,所以不跳转,执行下面的代码 dir "%VENV_DIR%\Scripts\Python.exe" >tmp/stdout.txt 2>tmp/stderr.txt if %ERRORLEVEL% == 0 goto :activate_venv for /f "delims=" %%i in ('CALL %PYTHON% -c "import sys; print(sys.executable)"') do set PYTHON_FULLNAME="%%i" # 有句echo,没用我就删除了 # 使用全局python.exe创建一个虚拟环境,地址为~\venv %PYTHON_FULLNAME% -m venv "%VENV_DIR%" >tmp/stdout.txt 2>tmp/stderr.txt # 成功后跳转去更新pip if %ERRORLEVEL% == 0 goto :upgrade_pip
我自己试着用python创建环境env,目录结构如下:
-
# 更新 ~\venv环境的pip :upgrade_pip "%VENV_DIR%\Scripts\Python.exe" -m pip install --upgrade pip if %ERRORLEVEL% == 0 goto :activate_venv
-
:activate_venv # 使用创建的venv环境下的python.exe,并激活改环境 set PYTHON="%VENV_DIR%\Scripts\Python.exe" # 解释器在这里换了一次。 call "%VENV_DIR%\Scripts\activate.bat"
-
# 使用env\sripts\python.exe 启动项目,并传入所有参数。 # 第一次启动后,我估计lacunch会将ACCELERATE改为true,并创建Scripts\accelerate.exe :launch %PYTHON% launch.py %* if EXIST tmp/restart goto :skip_venv pause exit /b
-
:skip_venv if [%ACCELERATE%] == ["True"] goto :accelerate goto :launch
-
# 第一次lacunch后,就可以用accelerate启动了。 :accelerate # echo set ACCELERATE="%VENV_DIR%\Scripts\accelerate.exe" if EXIST %ACCELERATE% goto :accelerate_launch :accelerate_launch echo Accelerating %ACCELERATE% launch --num_cpu_threads_per_process=6 launch.py if EXIST tmp/restart goto :skip_venv pause exit /b
总结:
- 用全局的python(安装的时候配置环境变量)创建了一个环境
venv
。如果我们指定非全局的python.exe创建环境按道理也可以? - 这个全局的python只是起一个临时的作用,就是为了创建环境
venv
。存储python解释器的变量更新为venv
下的解释器。 - 存储环境文件夹的参数也会更新为
venv
,安装的依赖包都存储在这个环境中。也就是使用~\venv\scripts\python.exe
运行pip,下载到~\venv\Lib\site-packages
。
现在我就一目了然了!!!
好,如果我已经运行过一遍了,那么我就需要改一些参数,以保证相对路径可以打包整个环境。
接下来SD打包的可执行猜测(当然没这么简单):
- 在第一次运行之后,修改
webui.bat
文件,全用相对路径或者%~dp0
:
@echo off
set PYTHON= 创建的venv环境下的python.exe目录,使用使用%~dp0表示当前运行路径。安装的所有依赖包估计就在这里
set GIT= git的地址
set VENV_DIR=创建的venv环境目录
set COMMANDLINE_ARGS=
call webui.bat
- 秋叶大佬整合包中没有
webui.bat
文件,用的webui.py进行启动的。也就是启动器做了重大修改。我猜测她创建环境在了.\python
之下,因为所有的依赖文件都在其中。而官方启动中是独立创建了一个venv
。
官方environment.bat文件,仅做自己的参考
@echo off
set DIR=%~dp0
set PATH=%DIR%\git\bin;%DIR%\python;%DIR%\python\Scripts;%PATH%
set PY_LIBS=%DIR%\python\Scripts\Lib;%DIR%\python\Scripts\Lib\site-packages
set PY_PIP=%DIR%\python\Scripts
set SKIP_VENV=1
set PIP_INSTALLER_LOCATION=%DIR%\python\get-pip.py
set TRANSFORMERS_CACHE=%DIR%\transformers-cache