【发布时间】: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 手动安装的库...可能是,我应该尽可能使用预编译的轮子,提供它们每个目标系统?或者您是否看到了执行此任务的更好方法?
【问题讨论】:
-
另外,如果您打算为 windows 环境交付,请注意编译需要很多并且很烦人,最好发送与您的应用程序一起预编译的库。对于 linux 环境,嗯,它主要取决于环境,所以你可能会坚持构建依赖关系。
-
谢谢你,@cyrbil。似乎安装阶段的构建在不同的系统上会有所不同,并且需要可能不可用的库。另一方面,为每个目标系统提供分发需要在每个目标系统上构建它们(正如我从 cx_Freeze 或 PyInstaller 的文档中看到的那样)。困境。请将您的评论作为答案让我接受。
标签: python bash pip distutils easy-install