Ich habe folgendes Problem: Ich möchte eine in Python geschriebene Nicht-Standardbibliothek in mein Skript importieren, welche in einem anderen Verzeichnis als meine Python-Installation liegt.
Die verwendete Python-Version ist 2.6, Betriebssystem ist Debian Squeeze (32bit).
Folgendes habe ich bereits ausprobiert:
kompletten Dateipfad -> / ist kein zulässiges Zeichen, er erkennt es also nicht als Dateipfad (auch weglassen des ersten / hat nicht geholfen)
kompletten Dateipfad als String -> keine zulässige Syntax, markiert am zweiten Anführungszeichen, egal ob doppelte oder einzelne.
nur den Modulnamen -> Findet (wenig überraschend) den Modulnamen nicht.
Meine letzte Lösungsidee ist, die zu importierende Bibliothek in irgendein Verzeichnis zu kopieren, allerdings weiß ich nicht in welches, meine Vermutung wäre unter /usr/lib/python2.6 (python 2.4,2.5, pyshared und pymodules sind auch möglich), oder eher in das Verzeichnis in dem auch meine Skripte liegen?
Ein weiteres Problem besteht darin, dass der Rechner kein Netz hat, also Sachen die per apt-get und ähnlichem funktionieren, helfen mir leider nicht weiter.
Laut der Dokumentation könnte ich auch sys.path oder sys.meta_path manipulieren, damit er es findet, allerdings weiß ich weder wie ich diese manipuliere, noch wie ich sie manipulieren müsste um das gewünschte Ergebnis zu erzielen...
Importer - wo sucht er?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Lass Dir doch mal ``sys.path`` in einer Shell ausgeben Das ist einfach eine Liste von Pfaden. Da kannst Du einfach mittels ``.append``-Methode etwas hinzufügen.Slag hat geschrieben: Laut der Dokumentation könnte ich auch sys.path oder sys.meta_path manipulieren, damit er es findet, allerdings weiß ich weder wie ich diese manipuliere, noch wie ich sie manipulieren müsste um das gewünschte Ergebnis zu erzielen...
Alternativ packst Du Dein Modul in ein dafür vorgesehens Verzeichnis. Unter Windows ist das "Lib/site-packages" im Python-Verzeichnis; unter Linux sollte sich das auch irgend wo unter /usr/shar o.ä. finden lassen. Lass einfach mal ein `find /usr -type d -name '*python*'` laufen, da findest Du sicher das gewünschte Verzeichnis.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Und last but not least gibt's auch noch die Umgebungsvariable PYTHONPATH, in der Doppelpunkt-separiert Pfade stehen, welche auch durchsucht werden.
Leider weiß ich nicht, wie ich mir sys.path anzeigen lassen kann (ich habe nur die Shell auf dem Rechner), weder der Name allein, noch ls, find oder echo $sys.path haben etwas gebracht.
Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?
Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wie wäre es damit:Slag hat geschrieben:Leider weiß ich nicht, wie ich mir sys.path anzeigen lassen kann (ich habe nur die Shell auf dem Rechner), weder der Name allein, noch ls, find oder echo $sys.path haben etwas gebracht.
Code: Alles auswählen
>>> import sys
>>> print(sys.path)
['', 'C:\\Windows\\system32\\python32.zip', 'C:\\Program Files (x86)\\Python32\\
DLLs', 'C:\\Program Files (x86)\\Python32\\lib', 'C:\\Program Files (x86)\\Pytho
n32', 'C:\\Program Files (x86)\\Python32\\lib\\site-packages']
Ich habe Dir ja einiges dazu gesagt. Probiere das obige doch mal bei Dir aus - oder den Vorschlag von deets. Dann siehst Du ja, welches Verzeichnis für 3rd-Party-Module geeignet ist. Einfach "blind" etwas in ein Verzeichnis kopieren bringt idR wenig. Wie Du bei meiner Anzeige unter Windows siehst, ist das Python-root-Verzeichnis nicht im Pfad - vermutlich ist das bei Dir auch der Fall, weswegen Deine Operation nicht zielführend war.Slag hat geschrieben: Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Du musst natürlich nicht aus der Shell des Betriebssystems heraus arbeiten, sondern aus der Python-Shell.Slag hat geschrieben:Leider weiß ich nicht, wie ich mir sys.path anzeigen lassen kann (ich habe nur die Shell auf dem Rechner), weder der Name allein, noch ls, find oder echo $sys.path haben etwas gebracht.
Erweitere, wie Hyperion schon geschrieben hat, den Python-Suchpfad aus dem Programm heraus um dein gewünschtes Verzeichnis.Slag hat geschrieben:Ich habe das komplette Verzeichnis nunmehr in /usr/share/python kopiert, nur findet er es leider nach wie vor nicht. Hast du vielleicht noch eine andere Idee?
Code: Alles auswählen
import sys
tools_dir = '/home/matthias/pyjects/tools'
if tools_dir not in sys.path:
sys.path.append(tools_dir)
Da hatte ich dich missverstanden, ich ging bei sys.path davon aus, dass eine Linux Systemvariable gemeint ist, danke für die Aufklärung.
Ich habe sys.path jetzt entsprechend ergänzt, mit sämtlichen Unterverzeichnissen die im kopierten Verzeichnis existierten, trotzdem findet er das Modul aber nicht (obwohl es genau in einem der angegebenen Verzeichnisse liegt, sogar als .py und als .pyc-Datei und eine __init__ ebenfalls als .py und .pyc vorhanden ist.), könnte es sich hierbei um eine Inkompatibilität zwischen verschiedenen Python-Versionen handeln und falls ja, wie bekomme ich das heraus? Oder müsste er in diesem Fall die Datei trotzdem zumindest erst Einmal finden? (mehr als die Bibliothek einzubinden macht das Skript bislang nicht)
Edit: Ich nehme meine Worte zurück, ich habe sys.path nur in einer shell verändert, dies hat aber keine globalen Auswirkungen, ergo haben die anderen shells nur in den alten Pfaden gesucht...
Ich mache es nochmal so wie /me es mir empfohlen hat.
Ich habe sys.path jetzt entsprechend ergänzt, mit sämtlichen Unterverzeichnissen die im kopierten Verzeichnis existierten, trotzdem findet er das Modul aber nicht (obwohl es genau in einem der angegebenen Verzeichnisse liegt, sogar als .py und als .pyc-Datei und eine __init__ ebenfalls als .py und .pyc vorhanden ist.), könnte es sich hierbei um eine Inkompatibilität zwischen verschiedenen Python-Versionen handeln und falls ja, wie bekomme ich das heraus? Oder müsste er in diesem Fall die Datei trotzdem zumindest erst Einmal finden? (mehr als die Bibliothek einzubinden macht das Skript bislang nicht)
Edit: Ich nehme meine Worte zurück, ich habe sys.path nur in einer shell verändert, dies hat aber keine globalen Auswirkungen, ergo haben die anderen shells nur in den alten Pfaden gesucht...
Ich mache es nochmal so wie /me es mir empfohlen hat.
Nein, keine Inkompatibilitaet, du machst aller Wahrscheinlichkeit einfach etwas falsch.
So zB geht's:
So zB geht's:
Code: Alles auswählen
dir@client3065:/tmp/ptest$ cd /tmp
dir@client3065:/tmp$ mkdir -p foo/bar
dir@client3065:/tmp$ cd foo
dir@client3065:/tmp/foo$ export PYTHONPATH=`pwd`/bar
dir@client3065:/tmp/foo$ echo "print 'hallo, ich bin bar'" > bar/testmodule.py
dir@client3065:/tmp/foo$ python -c "import testmodule"
hallo, ich bin bar
dir@client3065:/tmp/foo$
Das kann man doch auch schöner mit dem imp Modul lösen, oder?
the more they change the more they stay the same