2013-03-02 93 views
26

我正在編寫一個使用模塊SEAPI.py的sublime text 2插件,該模塊本身導入了requests module如何將第三方Python程序包包含在Sublime Text 2插件中

由於崇高文本2使用它自己的嵌入式Python解釋器,它看不到我的Ubuntu機器中安裝的請求模塊(我得到以下錯誤:ImportError:No module named requests)。

目前爲止我發現的最佳解決方案是將複製來自/usr/lib/python2.7/dist-packages/requests的'requests'模塊(文件的整個目錄)到崇高文本包中的我的插件目錄中DIR。 但之後,它說它找不到'urllib3'模塊。

有沒有更好的方式來導入請求模塊,以便我不必將所有文件複製到我的插件目錄中?

我使用的是當前的代碼如下:

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 
... 

編輯: 選擇的答案是正確的,修復了我的主要問題,但是使用當前版本的'Requests'和嵌入的sublime tex存在一個不同的問題t 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 

回答

21

你需要將完整的請求發佈與您的Python包捆綁在一起,然後修改Python的sys.path(查找模塊)以指向包含requests文件夾的文件夾。

  • 下載從PyPI將請求庫和插件文件夾下手動提取它在你的插件

  • 以前導入請求,追加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 

這還假設requestssetup.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

+0

感謝您的快速回復。我已經試過 - sys.path.append(os.path.join(os.path.dirname(__ file__),「/usr/lib/python2.7/dist-packages/」))。它似乎看到用pip安裝的'requests'模塊和'urllib3'模塊。但現在它有以下錯誤 - 文件「/usr/lib/python2.7/dist-packages/urllib3/filepost.py」,第15行,在 從io import BytesIO 文件「。\ io.py」,第63行,在 ImportError:沒有名爲_fileio的模塊 – 2013-03-03 08:39:22

+0

我編輯了我的問題,併爲此問題提供瞭解決方案。再次感謝Mikko! – 2013-03-03 10:27:14

+3

這個答案中的信息**非常重要**創建Sublime Text插件。這真的應該在官方的文檔... – zakdances 2013-08-24 00:05:19

5

米克的回答是不錯的,但我可能已經找到了一個稍微簡單的方法:

import MyAwesomePlugin.requests 

「MyAwesomePlugin」當然是你的插件的名稱。

+1

如果請求庫包含任何絕對導入,這很可能會中斷。 – 2013-08-27 11:29:15

+0

我沒有在這種情況下測試,所以你可能是對的。但是,我們希望'request'避免這樣做,因爲絕對路徑幾乎總是一個壞主意,除非絕對必要。 – zakdances 2013-08-28 01:15:40