python项目打包时,需要将虚拟环境与python自身安装路径下的lib包整合在一起,将如下内容保存为packvenv.sh文件,修改PYTHON_PATH(python的安装路径)以及VENV_PATH(虚拟环境的全路径)为自己的目录,然后给文件添加执行权限:chmod +x packvenv.sh,./packvenv.sh执行即可
Linux:packvenv.sh
#!/bin/bash
PYTHON_PATH=/usr/local/python2.7
VENV_PATH=~/.virtualenvs/venv-linux6
VENV_NAME=`basename $VENV_PATH`
echo $VENV_NAME
mkdir $VENV_NAME
mkdir $VENV_NAME/bin
# copy python lib
cp -r $PYTHON_PATH/lib $VENV_NAME/lib
rm -rf $VENV_NAME/lib/python2.7/site-packages
# copy venv python
cp $VENV_PATH/bin/python $VENV_NAME/bin/ || exit 1
# copy venv lib
packdir=$VENV_PATH/lib/python2.7
for e in `ls $packdir`
do
files=$packdir/$e
realfiles=`readlink $files`
if [ $realfiles ]; then
cp -r $realfiles $VENV_NAME/lib/python2.7/
else
cp -r $files $VENV_NAME/lib/python2.7/
fi
done
# remove .pyc .pyo and test files
remove_pyc_and_pyo_files() {
for e in `ls $1`
do
fullpath=$1/$e
if [[ "${e:0-5}" == "-info" || "${e:0-4}" == ".pyc" || "${e:0-4}" == ".pyo" || "$e" == "test" ]]; then
echo delete file:$fullpath
rm -rf $fullpath
elif [ -d $fullpath ]; then
remove_pyc_and_pyo_files $fullpath
fi
done
}
remove_pyc_and_pyo_files $VENV_NAME/lib/python2.7
rm -rf $VENV_NAME/lib/pkgconfig
cd $VENV_NAME/lib
ln -s python2.7 python
Windows:packvenv.bat
SET WD=%CD%
SET PACKAGEPATH=%WD%\win-build
SET "VIRTUALENV=venv"
SET "VIRTUALENVPATH=C:\Users\Administrator\Envs"
SET "PYTHON_HOME=C:\Python27"
SET "PYTHON_DLL=C:\Windows\SysWOW64\python27.dll"
:: get Python version for the runtime build ex. 2.7.1 will be 27
FOR /f "tokens=1 DELims=." %%G IN ('%PYTHON_HOME%/python.exe -c "import sys; print(sys.version.split(' ')[0])"') DO SET PYTHON_MAJOR=%%G
FOR /f "tokens=2 DELims=." %%G IN ('%PYTHON_HOME%/python.exe -c "import sys; print(sys.version.split(' ')[0])"') DO SET PYTHON_MINOR=%%G
SET "PYTHON_VERSION=%PYTHON_MAJOR%%PYTHON_MINOR%"
MKDIR "%PACKAGEPATH%\%VIRTUALENV%" > nul || EXIT /B 1
MKDIR "%PACKAGEPATH%\bin" > nul || EXIT /B 1
ECHO Copying python DLLs...
XCOPY /S /I /E /H /Y "%PYTHON_HOME%\DLLs" "%PACKAGEPATH%\%VIRTUALENV%\DLLs" > nul || EXIT /B 1
ECHO Copying python Lib...
XCOPY /S /I /E /H /Y "%PYTHON_HOME%\Lib" "%PACKAGEPATH%\%VIRTUALENV%\Lib" > nul || EXIT /B 1
RD /Q /S "%PACKAGEPATH%\%VIRTUALENV%\Lib\site-packages" 1> nul 2>&1 || RD /Q /S "%PACKAGEPATH%\%VIRTUALENV%\Lib\site-packages" 1> nul 2>&1
ECHO Copying virtual environment...
XCOPY /S /I /E /H /Y "%VIRTUALENVPATH%\%VIRTUALENV%\Lib" "%PACKAGEPATH%\%VIRTUALENV%\Lib" > nul || EXIT /B 1
IF %PYTHON_MAJOR% == 2 (
:: 如果site-packages中有backports模块,则需要执行此语句,这是因为python3以前该模块少个__init__.py文件
ECHO Fixing backports.csv for Python 2 by adding missing __init__.py...
type nul >> "%PACKAGEPATH%\%VIRTUALENV%\Lib\site-packages\backports\__init__.py"
)
ECHO Cleaning up unnecessary *.pyc *.pyo and tests files...
FOR /R "%PACKAGEPATH%\%VIRTUALENV%" %%f in (*.pyc *.pyo) do DEL /q "%%f" >nul 2>&1
FOR /R "%PACKAGEPATH%\%VIRTUALENV%" %%f in (tests) do RD /S /Q "%%f" >nul 2>&1
ECHO Staging Python...
COPY %PYTHON_DLL% "%PACKAGEPATH%\bin" > nul || EXIT /B 1
COPY %PYTHON_HOME%\python.exe "%PACKAGEPATH%\bin" > nul || EXIT /B 1
COPY %PYTHON_HOME%\pythonw.exe "%PACKAGEPATH%\bin" > nul || EXIT /B 1
EXIT /B 0