自动安装 Python 应用程序
Automate Python application installation
我有一个 Java 应用程序,它应该与安装在远程机器上的 Python 代理进行交互。我的主应用程序可以通过 SSH 访问这些远程机器。为了让用户的生活更简单,我想自动化代理安装过程,这样用户只需按下按钮,主应用程序就可以远程连接、安装和 运行 应用程序。
我预计:
- 现在远程将使用不同的 UNIX(Windows 然后);
- SSH 用户可能不是 root;
- Python安装在远程机器上;
- 远程计算机可能没有 Internet 连接。
我的 Python 代理使用 virtualenv 和 pip,有很多依赖项。我制作了一个脚本来下载 virtualenv 和依赖项作为 tar.gz / zip:
#!/usr/bin/env bash
# Should be the same in dist.sh and install_dist.sh.
VIRTUALENV_VERSION=13.0.3
VIRTUALENV_BASE_URL=https://pypi.python.org/packages/source/v/virtualenv
echo "Recreating dist directory..."
if [ -d "dist" ]; then
rm -rf dist
fi
mkdir -p dist
echo "Copying agent sources..."
cp -r src dist
cp requirements.txt dist
cp agent.sh dist
cp install_dist.sh dist
echo "Downloading virtualenv..."
curl -o dist/virtualenv-$VIRTUALENV_VERSION.tar.gz -O $VIRTUALENV_BASE_URL/virtualenv-$VIRTUALENV_VERSION.tar.gz
echo "Downloading requirements..."
mkdir dist/libs
./env/bin/pip install --download="dist/libs" --no-binary :all: -r requirements.txt
echo "Packing dist directory..."
tar cvzf dist.tar.gz dist
安装开始时,我的主应用程序将所有这些归档文件 scp 到远程机器,安装 virtualenv 和要求,复制所有需要的脚本:
#!/usr/bin/env bash
# Runs remotely.
SCRIPT_DIR="`dirname \"[=12=]\"`"
SCRIPT_DIR="`( cd \"$SCRIPT_DIR\" && pwd )`"
HOME_DIR="`( cd \"$SCRIPT_DIR/..\" && pwd )`"
VIRTUALENV_VERSION=13.0.3
echo "Installing virtualenv..."
tar xzf $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION.tar.gz --directory $SCRIPT_DIR
python $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION/virtualenv.py $HOME_DIR/env
if [ $? -ne 0 ]
then
echo "Unable to create virtualenv."
exit 1
fi
$HOME_DIR/env/bin/pip install $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION.tar.gz
if [ $? -ne 0 ]
then
echo "Unable to install virtualenv."
exit 1
fi
echo "Installing requirements..."
$HOME_DIR/env/bin/pip install --no-index --find-links="$SCRIPT_DIR/libs" -r $SCRIPT_DIR/requirements.txt
if [ $? -ne 0 ]
then
echo "Unable to install requirements."
exit 1
fi
echo "Copying agent sources..."
cp -r $SCRIPT_DIR/src $HOME_DIR
if [ $? -ne 0 ]
then
echo "Unable to copy agent sources."
exit 1
fi
cp -r $SCRIPT_DIR/agent.sh $HOME_DIR
if [ $? -ne 0 ]
then
echo "Unable to copy agent.sh."
exit 1
fi
cp -r $SCRIPT_DIR/requirements.txt $HOME_DIR
echo "Cleaning installation files..."
rm -rf $HOME_DIR/dist.tar.gz
rm -rf $SCRIPT_DIR
我在远程构建一些依赖项时遇到了问题 - 例如,它们可能需要 gcc 或其他应该使用 sudo 手动安装的库......可能是,我应该尽可能使用预编译的轮子,为每个目标系统提供它们?或者您是否发现了一些更好的方法来执行此任务?
也许可以提供完整打包的应用程序?看看 Freeze and py2exe.
此外,如果您计划为 windows 环境交付,请注意编译需要很多而且很烦人,最好发送与您的应用程序一起预编译的库。对于 linux 环境,嗯,它主要取决于环境,因此您可能会坚持构建依赖关系。
注意:来自您的评论:
providing distribution for each target system requires building them
on each target system
请注意,您可以进行交叉编译,这样您就可以针对不同的系统(甚至 Windows)进行构建,而无需 运行 具有此环境的机器。
我会继续使用交叉编译进行构建。最坏的情况是很少的主机会很烦人并且无法使用您的二进制文件。在这种情况下,请逐案解决问题。
祝你好运:)
我有一个 Java 应用程序,它应该与安装在远程机器上的 Python 代理进行交互。我的主应用程序可以通过 SSH 访问这些远程机器。为了让用户的生活更简单,我想自动化代理安装过程,这样用户只需按下按钮,主应用程序就可以远程连接、安装和 运行 应用程序。
我预计:
- 现在远程将使用不同的 UNIX(Windows 然后);
- SSH 用户可能不是 root;
- Python安装在远程机器上;
- 远程计算机可能没有 Internet 连接。
我的 Python 代理使用 virtualenv 和 pip,有很多依赖项。我制作了一个脚本来下载 virtualenv 和依赖项作为 tar.gz / zip:
#!/usr/bin/env bash
# Should be the same in dist.sh and install_dist.sh.
VIRTUALENV_VERSION=13.0.3
VIRTUALENV_BASE_URL=https://pypi.python.org/packages/source/v/virtualenv
echo "Recreating dist directory..."
if [ -d "dist" ]; then
rm -rf dist
fi
mkdir -p dist
echo "Copying agent sources..."
cp -r src dist
cp requirements.txt dist
cp agent.sh dist
cp install_dist.sh dist
echo "Downloading virtualenv..."
curl -o dist/virtualenv-$VIRTUALENV_VERSION.tar.gz -O $VIRTUALENV_BASE_URL/virtualenv-$VIRTUALENV_VERSION.tar.gz
echo "Downloading requirements..."
mkdir dist/libs
./env/bin/pip install --download="dist/libs" --no-binary :all: -r requirements.txt
echo "Packing dist directory..."
tar cvzf dist.tar.gz dist
安装开始时,我的主应用程序将所有这些归档文件 scp 到远程机器,安装 virtualenv 和要求,复制所有需要的脚本:
#!/usr/bin/env bash
# Runs remotely.
SCRIPT_DIR="`dirname \"[=12=]\"`"
SCRIPT_DIR="`( cd \"$SCRIPT_DIR\" && pwd )`"
HOME_DIR="`( cd \"$SCRIPT_DIR/..\" && pwd )`"
VIRTUALENV_VERSION=13.0.3
echo "Installing virtualenv..."
tar xzf $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION.tar.gz --directory $SCRIPT_DIR
python $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION/virtualenv.py $HOME_DIR/env
if [ $? -ne 0 ]
then
echo "Unable to create virtualenv."
exit 1
fi
$HOME_DIR/env/bin/pip install $SCRIPT_DIR/virtualenv-$VIRTUALENV_VERSION.tar.gz
if [ $? -ne 0 ]
then
echo "Unable to install virtualenv."
exit 1
fi
echo "Installing requirements..."
$HOME_DIR/env/bin/pip install --no-index --find-links="$SCRIPT_DIR/libs" -r $SCRIPT_DIR/requirements.txt
if [ $? -ne 0 ]
then
echo "Unable to install requirements."
exit 1
fi
echo "Copying agent sources..."
cp -r $SCRIPT_DIR/src $HOME_DIR
if [ $? -ne 0 ]
then
echo "Unable to copy agent sources."
exit 1
fi
cp -r $SCRIPT_DIR/agent.sh $HOME_DIR
if [ $? -ne 0 ]
then
echo "Unable to copy agent.sh."
exit 1
fi
cp -r $SCRIPT_DIR/requirements.txt $HOME_DIR
echo "Cleaning installation files..."
rm -rf $HOME_DIR/dist.tar.gz
rm -rf $SCRIPT_DIR
我在远程构建一些依赖项时遇到了问题 - 例如,它们可能需要 gcc 或其他应该使用 sudo 手动安装的库......可能是,我应该尽可能使用预编译的轮子,为每个目标系统提供它们?或者您是否发现了一些更好的方法来执行此任务?
也许可以提供完整打包的应用程序?看看 Freeze and py2exe.
此外,如果您计划为 windows 环境交付,请注意编译需要很多而且很烦人,最好发送与您的应用程序一起预编译的库。对于 linux 环境,嗯,它主要取决于环境,因此您可能会坚持构建依赖关系。
注意:来自您的评论:
providing distribution for each target system requires building them on each target system
请注意,您可以进行交叉编译,这样您就可以针对不同的系统(甚至 Windows)进行构建,而无需 运行 具有此环境的机器。
我会继续使用交叉编译进行构建。最坏的情况是很少的主机会很烦人并且无法使用您的二进制文件。在这种情况下,请逐案解决问题。
祝你好运:)