Probleme mit Unterverzeichnissen (Embedded Python + C++)

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
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

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
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

Weiß den keiner einen Rat? :(

Lg NoRulez
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;)
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

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?

Code: Alles auswählen

# u.py
from uv import uv

uv.Spam()
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
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

@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
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

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

Code: Alles auswählen

from module import python.list_dir
oder wie?

Zeig mal Code...

GnuShi
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

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

Code: Alles auswählen

print "Hello World"
mir geht es darum das er das Module list_dir.py nicht findet.

Lg NoRulez
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Du schreibst zwar oben, daß Du

Code: Alles auswählen

 PyRun_SimpleString("sys.path.insert(0, 'UV')"); 
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:

Code: Alles auswählen

import sys
sys.path
(Ist wahrscheinlich bloß Eulen nach Athen tragen. Tut mir leid, aber mehr fällt mir gerade nicht ein.)

Gruß,
Christian
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

ja habe ich, ich habe als test das script gleich nach /modules kopiert anstatt von modules/python und aufrufen tue ich

Code: Alles auswählen

PyRun_SimpleString("sys.path.insert(0, 'modules')");
aber funktionieren tut es dennoch nicht :(

Lg NoRulez
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.
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

@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

Code: Alles auswählen

print "Hello World"
drin stehen.

Lg NoRulez
Antworten