自动安装 Python 应用程序

Automate Python application installation

我有一个 Java 应用程序,它应该与安装在远程机器上的 Python 代理进行交互。我的主应用程序可以通过 SSH 访问这些远程机器。为了让用户的生活更简单,我想自动化代理安装过程,这样用户只需按下按钮,主应用程序就可以远程连接、安装和 运行 应用程序。

我预计:

我的 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)进行构建,而无需 运行 具有此环境的机器。
我会继续使用交叉编译进行构建。最坏的情况是很少的主机会很烦人并且无法使用您的二进制文件。在这种情况下,请逐案解决问题。

祝你好运:)