捆绑/执行python脚本+;将模块连接到远程计算机

捆绑/执行python脚本+;将模块连接到远程计算机,python,Python,我已经研究了其他python模块分发问题。我的需求有点不同(我想!我是python新手+) 我有很多python脚本需要在远程机器上执行。以下是目标环境的外观 这些机器将安装基本python运行时 我将有一个SSH帐户;我可以使用ssh远程登录或执行命令 我可以将文件(scp)复制到我的主目录中 我不允许在机器上安装任何东西;这些机器甚至可能无法访问互联网 我的脚本可能会使用一些“外来的”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”子目录中使用的所有模块
这可能吗?还是有更好的方法?我想我正在寻找的是将第三方模块“重新定位”到脚本目录中

提前谢谢

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

如果这些机器确实可以访问网络(不是internet,而是本地网络),您还可以将virtualenv放置在共享位置并从那里激活

它看起来像这样:

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

现在,便携式项目可以与其他机器进行远程连接。

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

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

有三件事可以让它变得非常重要:

  • 如果远程计算机没有(也不能)安装
    virtualenv
    ,则需要执行以下操作之一:
    • 在许多情况下,只需复制一个可重新定位的环境就可以了。请参阅“使环境可重新定位”的文档部分
    • 您始终可以在每台计算机上捆绑
      virtualenv
      本身和
      pip安装--user virtualenv
      (如果他们甚至没有
      pip
      ,则在这之前执行一些步骤)。这将使用户帐户处于永久更改状态。(但幸运的是,你的用户帐户将被屏蔽,所以谁在乎呢?)
    • 您可以编写自己的手动引导。请参阅“创建自己的引导脚本”一节
    • 默认情况下,您得到的远远超过了Python可执行文件、标准库等的需要
    • 如果机器不同,这可能不起作用,或者至少可能没有那么有效
    • 即使他们是,你仍然经常使你的捆绑数量级更大
    • 请参阅有关在不使用bin/python的情况下使用Virtualenv、-系统站点包以及可能的引导的文档部分
  • 如果您正在安装的任何Python模块也需要C库(例如,
    libxml2
    for
    lxml
    ),
    virtualenv
    对此没有帮助。事实上,您需要C库几乎完全相同(相同路径,兼容版本)
其他三个备选方案:

  • 如果您的需求足够简单(或者最简单的部分涉及到
    virtualenv
    没有帮助的事情,比如安装
    libxml2
    ),那么只需为第三方模块绑定.egg/.tgz/任何文件,并为每个模块编写一个执行
    pip-install--user
    的脚本,就可能更容易了,然后你就完蛋了
  • 仅仅因为你不需要一个完整的应用程序分发系统并不意味着你不能使用它
    py2app
    py2exe
    cx_freeze
    等都不是那么复杂,特别是在简单的情况下,使用点击即可执行的文件进行复制比使用显式环境更容易
  • zc.buildout
    是一个非常灵活和易于管理的工具,可以做三种选择中的任何一种。主要的缺点是学习曲线要陡峭得多

我将尝试这些建议;虽然我认为它们可能比我需要的更多。有什么方法可以通过修改PYTHON\u路径来做到这一点吗?嗯,它是
PYTHONPATH
,而不是
PYTHON\u路径
。我不知道你为什么要按摩它。如果只是将模块复制到scripts目录中,只需复制它们,它就可以正常工作,而不需要
PYTHONPATH
。如果很难确定要收集哪些模块,或者您需要具有C依赖项的C扩展模块,或者出于任何其他原因,这都不管用,
PYTHONPATH
将没有帮助。如果您确实想要按摩
PYTHONPATH
,当然可以,或者更简单地说,从脚本内部按摩
sys.path
,但是如果您不知道要用它做什么,您可能不需要它。