2

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

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

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

所以我喜欢做的是:

  • 将 python 脚本 + 模块的目录结构复制到远程计算机(例如在 /home/audituser/scripts 中)。并且模块可以复制到/home/audituser/scripts/pythhon_lib)
  • 然后执行一个脚本(比如 /home/audituser/scripts/myscript.py)。该脚本需要解析“python_lib”子目录中使用的所有模块。

这可能吗?或者有更好的方法吗?我想我正在寻找的是将第 3 方模块“重新定位”到脚本目录中。

提前致谢!

4

2 回答 2

3

远程机器是否彼此相同?而且,如果是这样,您能否设置一台与远程机器实际上相同的开发机器?

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

有三件事使它可能变得不平凡:

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

其他三种选择:

  • 如果您的需求足够简单(或者最简单的部分涉及无用的事情virtualenv,例如安装libxml2),那么将 .egg/.tgz/whatever 文件捆绑到第三方模块并编写一个脚本,pip install --user为每个脚本执行一个等等,然后你就完成了。
  • 仅仅因为你不需要一个完整的应用分发系统并不意味着你不能使用一个。py2app, py2exe,cx_freeze等并不是那么复杂,尤其是在简单的情况下,并且拥有一个点击即可复制的可执行文件比拥有一个显式环境更容易。
  • zc.buildout是一个非常灵活且易于管理的工具,可以做与这三种替代方法中的任何一种等效的工具。主要的缺点是学习曲线要​​陡峭得多。
于 2012-12-28T00:11:24.707 回答
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可以dist到其他机器上。

于 2012-12-28T00:06:11.070 回答