【问题标题】:Using Python libraries without installing them globally使用 Python 库而不全局安装它们
【发布时间】:2015-03-07 01:11:12
【问题描述】:

我有一个python脚本,想部署到各种PC上运行测试,需要用到第三方库pysnmp。由于我不想在每台目标PC上手动安装pysnmp,我想我可以将pysnmp(和相关的)eggs放在eggs/目录中,然后将其附加到python路径之前导入:

import sys
sys.path.append("./eggs/pysnmp-4.2.5-py3.4.egg")
sys.path.append("./eggs/pyasn1-0.1.7-py3.3.egg")
from pysnmp.entity.rfc3413.oneliner import cmdgen

只要我在包含eggs/ 的目录中执行脚本,它就会按预期工作,但是它看起来相当手动和混乱。有没有一种可移植的方式告诉 python 在我想要导入的任何时候搜索[path to module]/eggs/

【问题讨论】:

  • 您是否尝试过使用在运行时根据__file__ 的目录组件计算的绝对路径?
  • 为什么不在每台机器上创建一个 virtualenv 并将pysnmp 和你的模块安装到每个 virtualenv 中呢?您可以编写一个简单的脚本来执行此操作,这样您就无需“手动”执行操作。
  • @BryanOakley 谢谢,我没有尝试过,是的,它有效并解决了相对路径的问题。
  • @jme 重点是,我不想“设置”每台目标 PC ......我只想“开火然后忘记”。我可以创建一个预先安装了pysnmp 的virtualenv,然后将那个推送到目标PC吗?
  • “设置”的数量确实很少。你可以制作一个 bash 脚本来制作一个 virtualenv,安装 pysnmp 和你的代码大概三行。将 this 推送到每台机器并运行它。非常便携。

标签: python pythonpath egg


【解决方案1】:

您想使用virtualenvvirtualenvwrapper。这些是为 Python 程序创建非全局环境的非常常见且广泛使用的方法。

这是一个很好的介绍:

http://docs.python-guide.org/en/latest/dev/virtualenvs/

【讨论】:

  • 我喜欢这个解决方案,但它似乎不可移植(即每个虚拟环境都锁定在您创建它的计算机上)。还是我只是错过了什么?
  • @RPGillespie:不是真的,创建 virtualenv 的步骤可以在其他系统上运行,并且会在那里安装包。 virtualenv 仅将包与其他 Python 安装隔离,它不会将其绑定到特定架构。
  • @RPGillespie 这进入了一个很长的对话,但基本上你会想要打包你的模块(详见packaging.python.org/en/latest/distributing.html)。这样做,在任何机器上的 virtualenv 中安装您的模块及其所有依赖项将非常容易。这是一种标准做法。
  • 我喜欢这个解决方案的想法,但似乎 python 打包比它应该的要困难得多。有时我希望它像 npm 之类的,这样我就可以部署我的脚本 + 依赖项的 json 文件。
【解决方案2】:

我使用的解决方案是获取脚本的目录(例如:os.path.dirname(__file__)),然后在添加到sys.path时使用该目录的绝对路径。

【讨论】:

  • 我会接受这个答案,因为我得到了它的工作并且很简单,即使另一个答案可能是一个更好的长期解决方案。
猜你喜欢
  • 2020-04-22
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2012-02-22
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多