【问题标题】:Automate Python application installation自动化 Python 应用程序安装
【发布时间】:2015-06-09 09:49:13
【问题描述】:

我有一个 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 \"$0\"`"
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 和py2exe。
  • 另外,如果您打算为 windows 环境交付,请注意编译需要很多并且很烦人,最好发送与您的应用程序一起预编译的库。对于 linux 环境,嗯,它主要取决于环境,所以你可能会坚持构建依赖关系。
  • 谢谢你,@cyrbil。似乎安装阶段的构建在不同的系统上会有所不同,并且需要可能不可用的库。另一方面,为每个目标系统提供分发需要在每个目标系统上构建它们(正如我从 cx_Freeze 或 PyInstaller 的文档中看到的那样)。困境。请将您的评论作为答案让我接受。

标签: python bash pip distutils easy-install


【解决方案1】:

也许交付完整的应用程序?看看Freeze 和py2exe。

另外,如果您计划为 Windows 环境交付,请注意编译需要很多并且很烦人,最好发送与您的应用程序一起预编译的库。对于 linux 环境,嗯,它主要取决于环境,所以你可能会坚持构建依赖关系。

注意:来自您的评论:

为每个目标系统提供分发需要构建它们 在每个目标系统上

请注意,您可以进行交叉编译,这样您就可以针对不同的系统(甚至是 Windows)进行构建,而无需在此环境中运行机器。
我将继续使用交叉编译进行构建。最坏的情况是很少的主机会很烦人,并且无法使用您的二进制文件。在这种情况下,只需逐个解决问题。

祝你好运:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多