在使用conda pack打包所有包以供部署之前,我正在尝试对package进行猴子修补。
脚本设置conda
conda install -y --channel conda-forge conda-pack
conda create -y --name venv python=3.7
conda install -y --name venv --file requirements.txt然后猴子修补图书馆:
sed --in-place \
's/CFUNCTYPE(c_int)(lambda: None)/# CCCFUNCTYPE(c_int)(lambda: None)/g' \
/opt/conda/envs/venv/lib/python3.7/ctypes/__init__.py然后,它将所有东西打包以供部署:
conda pack --name venv --output "$BUILD_DIR/runtime.tar.gz"奇怪的是,当我将文件直接复制到构建文件夹中时:
cp /opt/conda/envs/venv/lib/python3.7/ctypes/__init__.py "$BUILD_DIR"猴子打补丁的文件在那儿。
但是,当我提取$BUILD_DIR/runtime.tar.gz时,该文件是其原始形式。
另一个奇怪的行为是,当我手动运行这些步骤时,猴子补丁文件在$BUILD_DIR/runtime.tar.gz中。
周围有相当多的容器,所以我想也许conda使用的是一些捕获的tarball,所以我尝试将其添加到脚本中:
conda clean --tarballs但这仍然没有解决问题。
我还尝试使用conda pack的显式路径选项,但也没有工作:
conda pack --prefix /opt/conda/envs/venv --output "$BUILD_DIR/runtime.explicit.tar.gz"除了:conda pack之外,/opt/conda/envs/venv/lib/python3.7/site-packages是否从另一个位置提取文件?
这并不能解释为什么手动操作会起作用,但也许它会给我指明一个新的石头,让我看看下面。
谢谢您抽时间见我
下面是整个脚本:
#!/usr/bin/env bash
#
# Bundle this project into a Rapid Deployment Archive (RDA)
set -ex
###########################
# Pre-reqs and pre-checks #
###########################
if [ ! -x "$(command -v conda)" ]; then
echo "conda is required to run this script" >&2
exit 1
fi
if [ -n "$CI_PROJECT_DIR" ]; then
DIR="$CI_PROJECT_DIR"
else
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)/.."
fi
DIST_DIR="$DIR/dist"
rm -rvf "$DIST_DIR"/*.zip
BUILD_DIR="$(mktemp -d)"
#####################################
# Build client Angular UI component #
#####################################
CLIENT_DIR="$DIR/client"
mkdir -pv "$BUILD_DIR/client"
pushd "$CLIENT_DIR" || exit 1
npm install
npm run build:default
cp -R "$CLIENT_DIR/dist/template-angular-ts-master/"* "$BUILD_DIR/client"
popd
#######################################
# Build server Python/flask component #
#######################################
# Packages are installed to /opt/conda/envs/$VENV_NAME/lib/python$PYTHON_VERSION/site-packages
if [ -n "$SSL_NO_VERIFY" ]; then
conda config --set ssl_verify false
fi
conda install -y --channel conda-forge conda-pack
conda create -y --name venv python=3.7
# Conda does not support -r spec or --file within a file
cp requirements/prod.txt requirements/prod.txt.noflag
sed -i '/^-r/d' requirements/prod.txt.noflag
conda install -y --name venv --file requirements/_base.txt --file requirements/prod.txt.noflag
sed --in-place \
's/CFUNCTYPE(c_int)(lambda: None)/# CCCFUNCTYPE(c_int)(lambda: None)/g' \
/opt/conda/envs/venv/lib/python3.7/ctypes/__init__.py
rm -f requirements/prod.txt.noflag
conda clean --tarballs
conda pack --name venv --output "$BUILD_DIR/runtime.tar.gz"
# Junk within pyapp that might be present if not building in CI
if [ -z "$CI_PROJECT_DIR" ]; then
find "$DIR" -name '*.pyc' -type f -delete
find "$DIR" -name '.DS_Store' -type f -delete
find "$DIR" -name '__pycache__' -type d -delete
fi
# Copy this project's stuff into build dir
cp -v -R "$DIR/config" "$DIR/pyapp" "$BUILD_DIR"
cp -v "$DIR"/rda/* "$BUILD_DIR"
cp -v setup.{py,cfg} pyproject.toml "$BUILD_DIR"
cp -v "$DIR"/scripts/{start-server.sh,wsgi.py} "$BUILD_DIR"
cp -v /opt/conda/envs/venv/lib/python3.7/ctypes/__init__.py "$BUILD_DIR"
# Try to extract the version and appKey if we have jq
if [ -x "$(command -v jq)" ]; then
VERSION="-$(jq -j '.version' rda/rda.manifest)"
appKey="$(jq -j .appKey rda/rda.manifest)"
else
VERSION=''
appKey="$(grep --color=never -oP 'appKey":\s+"\K[^"]+' rda/rda.manifest)"
fi
if [ -z "$appKey" ]; then
appKey="my.webapp.ng-py"
fi
# Bundle into RDA ZIP
mkdir -pv "$DIST_DIR"
pushd "$BUILD_DIR"
zip -q -9 -r "$DIST_DIR/${appKey}${VERSION}.rda.zip" *
popd
rm -rf "$BUILD_DIR"
ls -1 -l -F "$DIST_DIR"/*.zip
conda clean -afy发布于 2021-11-24 01:55:02
我无法让猴子进行修补,但我发现ctypes不是numpy的一部分,而是Python标准库的一部分。因此,conda pack很可能会对Python标准库有一点不同的对待。
因此,我放弃了猴子补丁,发现升级Python版本解决了根本问题。
谢谢
https://stackoverflow.com/questions/70087453
复制相似问题