【问题标题】:How to include third party Python packages in Sublime Text 2 plugins如何在 Sublime Text 2 插件中包含第三方 Python 包
【发布时间】:2013-02-17 07:12:27
【问题描述】:

我正在编写一个 sublime text 2 插件,它使用一个模块 SEAPI.py,该模块本身导入 requests module

由于 sublime text 2 使用它自己的嵌入式 python 解释器,它没有看到我的 ubuntu 机器中安装的 requests 模块(我收到以下错误:ImportError: No module named requests)。

到目前为止,我能找到的最佳解决方案是将“请求”模块(文件的整个目录)从 /usr/lib/python2.7/dist-packages/requests 复制到 sublime 文本包目录中的插件目录中. 但在那之后,它说它找不到'urllib3'模块。

有没有更好的方法来导入 requests 模块,这样我就不必将所有文件复制到我的插件目录中?

我目前使用的代码如下:

MyPlugin.py

import sublime
import sublime_plugin
import SEAPI
...

SEAPI.py

import requests
try:
    import simplejson as json
except:
    import json
from time import time, sleep
...

编辑: 选择的答案是正确的,并且解决了我的主要问题,但是使用当前版本的“请求”和嵌入式 sublime text 2 解释器存在不同的问题。 ST2 的 python 缺少常规 2.7 python 中存在的各种模块(例如'fileio')。

我已经通过使用此处的“请求”模块解决了这个问题: https://github.com/bgreenlee/sublime-github

我不得不将 'urllib3/response.py' 文件编辑为:

try:
    from cStringIO import StringIO as BytesIO
except ImportError:
    pass  # _fileio doesn't seem to exist in ST's python in Linux, but we don't need it

【问题讨论】:

    标签: python plugins sublimetext2 distutils python-requests


    【解决方案1】:

    您需要将完整的请求分发与您的 Python 包捆绑在一起,然后修改 Python 的 sys.path(它在其中查找模块)以指向包含 requests 文件夹的文件夹。

    • 从 PyPi 下载 Requests 库并在插件文件夹下手动解压

    • 在插件中导入请求之前,将 corrcet 文件夹附加到 sys.path 以指向可以找到请求导入的文件夹

    (未经测试的)代码应如下所示:

      import sys 
      import os
    
      # request-dists is the folder in our plugin
      sys.path.append(os.path.join(os.path.dirname(__file__), "requests-dist"))
    
      import requests
    

    这还假设requests setup.py 在您使用easy_installpip 安装模块时不会进行任何黑客攻击。

    您也可以直接导入requests zip,因为 Python 支持从 ZIP 文件导入,前提是请求以兼容的方式分发。示例(高级):

    https://github.com/miohtama/ztanesh/blob/master/zsh-scripts/python-lib/zipimporter.py

    更多关于 sys.path 技巧 (2004)

    http://www.johnny-lin.com/cdat_tips/tips_pylang/path.html

    【讨论】:

    • 感谢您的快速回复。我试过这个 - sys.path.append(os.path.join(os.path.dirname(file), "/usr/lib/python2.7/dist-packages/")) .似乎看到了使用 pip 安装的“请求”模块和“urllib3”模块。但现在它有以下错误 - 文件“/usr/lib/python2.7/dist-packages/urllib3/filepost.py”,第 15 行,在 from io import BytesIO File“.\io.py”,第 63 行,在 ImportError: No module named _fileio
    • 我已经用解决这个问题的方法编辑了我的问题。再次感谢 Mikko!
    • 此答案中的信息对于创建 Sublime Text 插件非常重要。它真的应该在官方文档中......
    • 或者 ST 应该让他们的插件像任何普通的 Python 应用程序一样开发(允许使用 virtualenv 等)。然后我们可以在插件的main.py 中添加pip install requestsimport requests
    • @yourfriendzak 不幸的是,最好和最有前途的开源 sublime 克隆是用 GoLang 编写的,而不是 python。 limetext
    【解决方案2】:

    Mikko 的回答很好,但我可能找到了稍微简单的方法:

    import MyAwesomePlugin.requests
    

    “MyAwesomePlugin”当然是插件的名称。

    【讨论】:

    • 如果请求库包含任何绝对导入,这很可能会中断。
    • 我没有在那种情况下进行测试,所以你可能是对的。但我们希望requests 避免这样做,因为除非绝对必要,否则绝对路径几乎总是一个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2019-11-20
    • 2012-10-18
    • 2017-07-27
    • 2013-01-28
    • 2011-04-23
    相关资源
    最近更新 更多