Importer - wo sucht er?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Slag
User
Beiträge: 9
Registriert: Mittwoch 7. Dezember 2011, 15:44

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...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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
deets

Und last but not least gibt's auch noch die Umgebungsvariable PYTHONPATH, in der Doppelpunkt-separiert Pfade stehen, welche auch durchsucht werden.
Slag
User
Beiträge: 9
Registriert: Mittwoch 7. Dezember 2011, 15:44

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Wie wäre es damit:

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']
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?
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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Du musst natürlich nicht aus der Shell des Betriebssystems heraus arbeiten, sondern aus der Python-Shell.
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?
Erweitere, wie Hyperion schon geschrieben hat, den Python-Suchpfad aus dem Programm heraus um dein gewünschtes Verzeichnis.

Code: Alles auswählen

import sys
tools_dir = '/home/matthias/pyjects/tools'
if tools_dir not in sys.path:
    sys.path.append(tools_dir)
Slag
User
Beiträge: 9
Registriert: Mittwoch 7. Dezember 2011, 15:44

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

Nein, keine Inkompatibilitaet, du machst aller Wahrscheinlichkeit einfach etwas falsch.

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$ 
Slag
User
Beiträge: 9
Registriert: Mittwoch 7. Dezember 2011, 15:44

Dankeschön für eure Hilfe, mit der Methode von /me hat es jetzt funktioniert :)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das kann man doch auch schöner mit dem imp Modul lösen, oder?
the more they change the more they stay the same
Antworten