2013-03-02 11 views
26

Ich schreibe ein erhabenes Text-2-Plugin, das ein Modul SEAPI.py verwendet, das selbst die requests module importiert.Wie man Python-Pakete von Drittanbietern in Sublime Text 2-Plugins einbindet

Da sublime text 2 seinen eigenen eingebetteten Python-Interpreter verwendet, sieht er nicht, dass das Anfrage-Modul in meinem ubuntu-Rechner installiert ist (ich bekomme den folgenden Fehler: ImportError: Kein Modul namens Requests).

Die beste Lösung, die ich bisher finden konnte, war, das Modul 'requests' (das gesamte Verzeichnis der Dateien) von /usr/lib/python2.7/dist-packages/requests in mein Plugin-Verzeichnis in den Textpaketen zu kopieren Richt. Aber danach heißt es, dass es das Modul 'urllib3' nicht finden kann.

Gibt es eine bessere Möglichkeit, das Anfrage-Modul zu importieren, so dass ich nicht alle Dateien in mein Plugin-Verzeichnis kopieren muss?

Der aktuelle Code verwende ich wie folgt:

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: Die gewählte Antwort ist richtig und behebt meine Hauptfrage, aber ein anderes Problem besteht bei der Verwendung der aktuellen Version von 'Anfragen' mit dem eingebetteten Sublime-Text t 2 Dolmetscher. ST2 Python fehlt verschiedene Module, die in regulären 2.7 Python (wie "Fileio") existieren.

Ich habe es gelöst mit der Verwendung des Moduls 'Anfragen' von hier: https://github.com/bgreenlee/sublime-github

Und ich hatte die 'urllib3/response.py' Datei auf diese bearbeiten:

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 

Antwort

21

Sie Sie müssen die vollständige Anforderungsverteilung mit Ihrem Python-Paket bündeln und dann Pythons sys.path (wo es nach Modulen sucht) auf einen Ordner mit dem Ordner requests verweisen.

  • Download-Anfragen Bibliothek aus einem PyPI und entpacken Sie es manuell unter dem Plugin-Ordner

  • Bevor Import-Anfragen in Ihrem Plugin, hängen Sie den corrcet Ordner sys.path einen Ordner zu zeigen, wo es kann gefunden Anfragen importieren

Der (ungetestet) Code wie etwa wie folgt aussehen:

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 

Dies setzt auch voraus, dass requestssetup.py keine Hacks ausführt, wenn Sie das Modul mit easy_install oder pip installieren.

Sie können auch requests zip direkt importieren, da Python das Importieren von ZIP-Dateien unterstützt, vorausgesetzt, dass die Anfragen auf kompatible Weise verteilt werden.Beispiel (Fortgeschrittene):

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

Mehr über sys.path Trick (2004)

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

+0

danke für die schnelle antwort. Ich habe es versucht - sys.path.append (os.path.join (os.path.dirname (__ file__), "/usr/lib/python2.7/dist-packages/")). Es sieht sowohl das Modul 'Anfragen' als auch das Modul 'urllib3' aus, die mit pip installiert wurden. Aber jetzt hat es die folgende Fehler - Datei "/usr/lib/python2.7/dist-packages/urllib3/filepost.py", Zeile 15, in von io Import BytesIO Datei "\ io.py." Zeile 63, in ImportError: Kein Modul namens _fileio –

+0

Ich habe meine Frage mit einer Lösung für dieses Problem bearbeitet. Danke nochmal Mikko! –

+3

Die Informationen in dieser Antwort sind unglaublich wichtig für die Erstellung von Sublime Text Plugins. Es sollte wirklich in der offiziellen Dokumentation sein ... – zakdances

5

Mikko Antwort ist gut, aber ich kann einen etwas einfacheren Weg gefunden haben:

import MyAwesomePlugin.requests 

"MyAwesomePlugin" ist natürlich der Name Ihres Plugins.

+1

Dies ist höchst wahrscheinlich, wenn die Bibliothek der Anfragen absolute Importe enthält. –

+0

Ich habe nicht in diesem Szenario getestet, also könnten Sie Recht haben. Aber lassen Sie uns hoffen, 'Requests' vermeiden dies, weil absolute Pfade fast immer eine schlechte Idee sind, es sei denn, sie sind absolut notwendig. – zakdances