Seite 1 von 1
Probleme mit Unterverzeichnissen (Embedded Python + C++)
Verfasst: Montag 25. Februar 2008, 16:19
von NoRulez
Hey @all,
wenn ich ein Python script im lokalen verzeichnis habe funktioniert es auch wunderbar, jedoch sobald sich das Script in einem Unterverzeichnis (UV) befindet bekomme ich von PyImport_Import() immer NULL
Folgendes habe ich schon probiert jedoch ohne Erfolg:
1.) In das Unterverzeichnis wechseln
2.) eine leere __init__.py im Unterverzeichnis
3.) Aufrufen des Modules mittels UV.Modules
4.) vorheriges Aufrufen von
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.insert(0, '')");
PyRun_SimpleString("sys.path.insert(0, 'UV')");
Nichts hat geholfen. Wäre dankbar wenn mir jemand aus diesem Problem helfen könnte.
Vielen Dank im Voraus und LG
NoRulez
Verfasst: Montag 25. Februar 2008, 20:35
von NoRulez
Weiß den keiner einen Rat?
Lg NoRulez
Verfasst: Montag 25. Februar 2008, 20:49
von Hyperion
Wenn einer einen Rat wüßte, hätte er ihn vermutlich gepostet
Außerdem kann es ja durchaus sein, dass derjenige diesen Thread noch nicht gesehen hat ...
Auf jeden Fall muss man ihn nicht sofort pushen, wenn er mal nicht mehr an 3. oder 4. Stelle steht - und so weit "unten" war er nun noch wirlich nicht
Re: Probleme mit Unterverzeichnissen (Embedded Python + C++)
Verfasst: Montag 25. Februar 2008, 21:28
von Gnushi
Hi!
NoRulez hat geschrieben:
wenn ich ein Python script im lokalen verzeichnis habe funktioniert es auch wunderbar, jedoch sobald sich das Script in einem Unterverzeichnis (UV) befindet bekomme ich von PyImport_Import() immer NULL
Mhh, hift folgendes?
und im Verzeichnis uv liegt dann eine leere "__init__.py" wie auch die Datei uv.py:
Code: Alles auswählen
# uv/uv.py
def Spam():
print "I like SPAM, SPAM, SPAM..."
GnuShi
Verfasst: Dienstag 26. Februar 2008, 10:58
von NoRulez
@Gnushi: Funktioniert leider nicht.
Bei mir heißt der komplette Pfad am System: ./modules/python/list_dir.py
Von PyImport_Import bekomme ich danach folgende Exception:
Import Error: Couldn't found module modules.python.list_dir
Habe jetzt eine __init__.py in ./modules/__init__.py
und eine __init__.py in ./modules/python/__init__.py
Lg NoRulez
Verfasst: Dienstag 26. Februar 2008, 13:31
von Gnushi
NoRulez hat geschrieben:Von PyImport_Import bekomme ich danach folgende Exception:
Import Error: Couldn't found module modules.python.list_dir
Wie rufst Du was auf unter Python? Schreibst Du sowas wie
oder wie?
Zeig mal Code...
GnuShi
Verfasst: Dienstag 26. Februar 2008, 16:53
von NoRulez
Also ich habe irgendwo ein fertiges python script sagen wir es liegt im Verzeichnis modules/python und heißt list_dir.py also modules/python/list_dir.py
Verzeichnisstruktur (Hauptverzeichnis => HV):
Code: Alles auswählen
HV
|
+ Program.exe
|
+ modules
| |
| + python
| |
| + list_dir.py
und ich möchte in meinem c++ Program (Program.exe) die Datei/Script/Module list_dir.py aufrufen mittels PyImport_Import()
im moment siehts so aus:
Code: Alles auswählen
HV
|
+ Program.exe
|
+ modules
| |
| + __init__.py (leer)
| + python
| |
| + __init__.py (leer)
| + list_dir.py
Der code für list_dir.py sieht wie folgt aus:
Code: Alles auswählen
# -*- coding: cp1252 -*-
# search for filename in given directory and its subdirectories,
# but limit the depth of subdirectories to search in
import os
import string
import hashlib
class sFileInfo:
def __init__(_self, filename = "", filesize = 0, checksum = ""):
_self.filename = filename
_self.filesize = filesize
_self.checksum = checksum
def limited_walk(folder, limit, n=0):
"""
generator similar to os.walk(), but with limited subdirectory depth
"""
if n > limit:
return
for file in os.listdir(folder):
file_path = os.path.join(folder, file)
if os.path.isdir(file_path):
for item in limited_walk(file_path, limit, n + 1):
yield item
else:
yield file_path
def calcHashFromFile(filename):
fp = open(filename, "rb")
checksum = hashlib.new('md5', fp.read())
return checksum.hexdigest()
def writeIndexFile(filename, directory):
file_list = []
for fullpath in limited_walk(directory, 9999999):
file_list.append(sFileInfo(fullpath, os.lstat(fullpath).st_size, calcHashFromFile(fullpath)))
file_list.sort()
pFile = open(filename, "w")
xml_version = "1.0"
xml_encoding = "iso-8859-15"
pFile.write("<?xml version=\"%s\" encoding=\"%s\"?>\n\n" % (xml_version, xml_encoding))
pFile.write("<filelist>\n")
for f in file_list:#[1:10]:
pFile.write(" <file name=\"%s\" size=\"%ld\" checksum=\"%s\"/>\n" % (f.filename, f.filesize, f.checksum))
pFile.write("</filelist>\n")
pFile.close()
Tut aber dem Problem nichts zur sache, da in dem python script alles mögliche drinnen stehen kann, selbst
mir geht es darum das er das Module list_dir.py nicht findet.
Lg NoRulez
Verfasst: Dienstag 26. Februar 2008, 17:04
von CM
Du schreibst zwar oben, daß Du
aufrufst, aber bist Du Dir wirklich sicher, daß der Pfad im Pythonpath ist? Fehler ausgeschlossen? Also wirklich ...\modules\python drin?
Klingt blöde, ich weiß, aber manchmal passieren ja solche Dinge. Du kannst es ganz einfach im HV testen:
(Ist wahrscheinlich bloß Eulen nach Athen tragen. Tut mir leid, aber mehr fällt mir gerade nicht ein.)
Gruß,
Christian
Verfasst: Dienstag 26. Februar 2008, 17:22
von NoRulez
ja habe ich, ich habe als test das script gleich nach /modules kopiert anstatt von modules/python und aufrufen tue ich
aber funktionieren tut es dennoch nicht
Lg NoRulez
Verfasst: Dienstag 26. Februar 2008, 18:04
von BlackJack
Keine Hilfe für's Problem, aber:
Der Unterstrich bei `_self` ist "komisch". Warum ist der da?
Die Liste zu sortieren bringt nichts, solange `sFileInfo` keinen Vergleichsoperatoren, am besten `__cmp__()` nicht implementiert. Was bedeutet das 's' in `sFileInfo`?
Die Hashfunktion kann unangenehme Folgen haben, wenn man das mit einer *grossen* Datei versucht.
Dateinamen können Zeichen enthalten, die ungültiges XML zur Folge haben. Unter Unix kann sogar alles ausser dem Nullbyte in einem Namen sein.
Verfasst: Dienstag 26. Februar 2008, 19:33
von NoRulez
@BlackJack, danke für die Info, mir ging es aber eigentlich um das Problem mit den Verzeichnissen. Wie gesgt war nur ein beispielscript, da kann auch einfach nur
drin stehen.
Lg NoRulez