2012-12-28 67 views
2

我已经看过其他的python模块分发问题。我的需求有点不同(我认为!,我是Python新手+)捆绑/执行Python脚本+模块到远程机器

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

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

所以我想要做的是:

  • 副本Python脚本+模块远程机器(比如在/ home/audituser /脚本)的目录结构。和模块可以复制到/ home/audituser/scripts/pythhon_lib)
  • 然后执行一个脚本(比如说/home/audituser/scripts/myscript.py)。该脚本需要解析'python_lib'子目录中使用的所有模块。

这是可能的吗?还是有更好的方法来做到这一点?我想我所看到的是将第三方模块“重新定位”到脚本目录中。

在此先感谢!

+0

我会尝试这些建议;尽管我认为他们可能比我需要的更多。 有没有什么办法可以通过按摩PYTHON_PATH来做到这一点? –

+0

嗯,它是'PYTHONPATH',而不是'PYTHON_PATH'。我不知道为什么你需要按摩它。如果只是将模块复制到脚本目录中,只需复制它们即可,不需要'PYTHONPATH'。如果要弄清楚哪些模块难以收集,或者需要C扩展模块和C依赖关系,或者由于其他原因,这不会起作用,“PYTHONPATH”将无济于事。如果你想按摩'PYTHONPATH',当然你可以 - 或者更简单地说,从脚本内部按摩'sys.path' - 但是如果你不知道你想用它做什么,你可能不会'不需要它。 – abarnert

回答

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可以disted到其他机器。

3

远程机器是否彼此相同?而且,如果是这样,你能建立一个和远程机器一样的开发机器吗?

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

有三样东西,使得它潜在的不平凡:

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

三种选择:

  • 如果你的需求是很简单(或最少简单的零件涉及的事情,virtualenv不帮助,如安装libxml2),它可能更容易只将第三方模块的.egg/.tgz /任何文件捆绑在一起,然后编写一个脚本,为每个模块创建一个pip install --user等等,然后就完成了。
  • 仅仅因为你不需要需要一个完整的应用程序分发系统并不意味着你不能使用它。 py2apppy2execx_freezecx_freeze等都不是全部复杂,特别是在简单的情况下,并且具有点击即走的可执行文件来复制比有明确的环境更容易。
  • zc.buildout是一个令人惊讶的灵活和可管理的工具,可以做任何三个替代品的等值。主要的缺点是有一个更陡峭的学习曲线。
相关问题