Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to include third party Python packages in Sublime Text 2 plugins

I'm writing a sublime text 2 plugin that uses a module SEAPI.py which in itself imports the requests module.

Since sublime text 2 uses it's own embedded python interpreter, it doesn't see the requests module installed in my ubuntu machine (I get the following error: ImportError: No module named requests).

Best solution I could find so far was to copy the 'requests' module (the whole directory of files) from /usr/lib/python2.7/dist-packages/requests into my plugin directory in the sublime text packages dir. But after that, it says that it can't find the 'urllib3' module.

Is there a better way to import the requests module so that I won't have to copy all the files into my plugin directory ?

The current code I'm using is as follows:

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

Edit: The selected answer is correct and fixes my main question, but a different problem exists with using the current version of 'Requests' with the embedded sublime text 2 interpreter. ST2's python is missing various modules which exist in regular 2.7 python (such as 'fileio').

I've solved it with using the 'Requests' module from here: https://github.com/bgreenlee/sublime-github

And I had to edit the 'urllib3/response.py' file to this:

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 
like image 834
Alexey Zagalsky Avatar asked Mar 02 '13 23:03

Alexey Zagalsky


People also ask

How do I use modules in Sublime Text?

On Sublime Text > Tools > Build System > New Build System... and change "path_to_your_desired_python_version" to point to your desired version of python. Now save the build you just created, for example "Python3. 7X.

Does Sublime Text have plugins?

You're going to have to turn to plugins (also known as packages) for your Sublime Text. It's worth noting that our list of our favorite Sublime Text plugins is fairly versatile and is (mostly) random in order.


2 Answers

You need to bundle full requests distribution with your Python package and then modify Python's sys.path (where it looks for modules) to point to a folder containing requests folder.

  • Download Requests library from a PyPi and extract it manually under your plugin folder

  • Before importing requests in your plugin, append the corrcet folder to sys.path to point a folder where it can found requests import

The (untested) code should look like something like this:

  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 

This also assumes that requests setup.py does not do any hacks when you install the module using easy_install or pip.

You also could import requests zip directly as Python supports importing from ZIP files, assuming requests is distributed in compatible way. Example (advanced):

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

More about sys.path trick (2004)

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

like image 139
Mikko Ohtamaa Avatar answered Sep 22 '22 06:09

Mikko Ohtamaa


Mikko's answer is good, but I may have found a slightly easier way:

import MyAwesomePlugin.requests 

"MyAwesomePlugin" being the name of your plugin, of course.

like image 38
zakdances Avatar answered Sep 23 '22 06:09

zakdances