将python脚本+模块捆绑/执行到远程机器

时间:2012-12-28 00:01:34

标签: python

我已经研究过其他python模块分发问题。我的需求有点不同(我想!我是python新手+)

我需要在远程计算机上执行一堆python脚本。这是目标环境的样子;

  • 机器将安装基本python运行时间
  • 我将拥有一个SSH帐户;我可以使用ssh
  • 远程登录或执行命令
  • 我可以将文件(scp)复制到我的家庭目录
  • 我不允许在机器上安装任何东西;这些机器甚至可能无法访问互联网
  • 我的脚本可能会使用一些“异国情调”的python模块 - 很可能它们不会出现在目标机器中
  • 审核后,我的主目录将从机器中取消(不留任何痕迹)

所以我喜欢做的是:

  • 将python脚本+模块的目录结构复制到远程计算机(例如/ home / audituser / scripts)。模块可以复制到/ home / audituser / scripts / pythhon_lib)
  • 然后执行一个脚本(比如/home/audituser/scripts/myscript.py)。该脚本需要解析'python_lib'子目录中使用的所有模块。
这可能吗?或者有更好的方法吗?我想我正在寻找的是将第三方模块“重新定位”到脚本目录中。

提前感谢!

2 个答案:

答案 0 :(得分:3)

远程机器是否彼此相同?如果是这样,你能设置一个与远程机器有效相同的开发机器吗?

如果是这样,virtualenv使这几乎变得微不足道。在您的开发计算机上创建virtualenv,使用virtualenv pip副本将任何第三方模块安装到其中,在其中构建脚本,然后将整个环境复制到每个远程机器。

有三件事可能使它变得非常重要:

  • 如果远程计算机没有(并且不能)安装virtualenv,则需要执行以下操作之一:
    • 在许多情况下,只需复制--relocatable环境即可。请参阅“使环境可重定位”文档部分。
    • 您始终可以在每台计算机上捆绑virtualenv本身和pip install --user virtualenv(如果他们甚至没有pip,则可以在此前几步)。这将使用户帐户处于永久更改状态。 (但幸运的是,您的用户帐户将会受到影响,所以谁在乎呢?)
    • 您可以编写自己的手动引导程序。请参阅“创建自己的Bootstrap脚本”一节。
    • 默认情况下,您可以获得比您需要的更多 - Python可执行文件,标准库等。
    • 如果机器不相同,这可能不起作用,或者至少可能效率不高。
    • 即使它们是,你仍然经常使你的捆绑数量级更大。
    • 请参阅有关使用不带bin / python的Virtualenv, - system-site-packages以及可能的引导的文档部分。
  • 如果您安装的任何Python模块也需要C库(例如,libxml2 lxml),virtualenv对此无效。实际上,您需要C库几乎完全相同(相同路径,兼容版本)。

其他三种选择:

  • 如果您的需求足够简单(或者最简单的部分涉及virtualenv无法解决的问题,例如安装libxml2),则可能更容易捆绑.egg / .tgz /第三方模块的任何文件,并编写一个脚本,为每个模块执行pip install --user等等,然后你就完成了。
  • 仅仅因为你不需要一个完整的应用程序分发系统并不意味着你不能使用它。 py2apppy2execx_freeze等并非所有 都很复杂,特别是在简单的情况下,并且有一个点击即可执行文件可以复制周围比拥有明确的环境更容易。
  • zc.buildout是一个非常灵活且易于管理的工具,可以完成三种替代方案中的任何一种。主要缺点是学习曲线更加陡峭。

答案 1 :(得分:2)

您可以使用virtualenv为项目创建自包含的环境。这可以包含您自己的脚本以及任何依赖库。然后,您可以使env可重定位(--relocatable),并将其同步到目标计算机,激活它并运行脚本。

如果这些机器确实具有网络访问权限(不是互联网,而只是本地网络),您也可以将virtualenv放在共享位置并从那里激活。

它看起来像这样:

virtualenv --no-site-packages portable_proj
cd portable_proj/
source bin/activate
# install some deps
pip install xyz
virtualenv --relocatable .

现在可以将portable_proj发送给其他计算机。