Seite 1 von 1

probleme mit import

Verfasst: Dienstag 26. Januar 2010, 13:19
von mathi
Hallo zusammen,

in einem Programm binde ich mit

Code: Alles auswählen

from datei import func
eine funktion func() ein, diese ist folgendermaßen in datei.py definiert ist:

Code: Alles auswählen

def func(wert):
    create=file(tempdir+"\\document%s.pdf" % wert, "wb")
das funktioniert soweit erstmal wunderbar.

Jetzt habe ich ein Steuerprogramm geschrieben, dort habe ich den Start von Programm an einen Button gebunden.
Programm startet wunderbar, aber beim ausführen erhalte ich die Fehlermeldung

Code: Alles auswählen

IOError: [Errno 2] No such file or directory: u'c:\\temp\\tmp9vvvleTemppP\\document0.pdf'
was darauf schließen läßt, dass func() zwar aufgerufen wird (da sonst der Fehler "func() nicht gefunden" lauten würde) , aber func() produziert nicht dokument0.pdf....

Wie geschrieben, rufe ich Programm direkt auf funktioniert alles perfekt, rufe ich Programm über Steuerprogramm auf habe ich den Fehler. Woran kann das liegen??

Ich hoffe ich konnte mich verständlich machen,
Gruß Mathi

Re: probleme mit import

Verfasst: Dienstag 26. Januar 2010, 13:38
von Masaru
Hallo auch,

alleine für diese Zeile:

Code: Alles auswählen

create=file(tempdir+"\\document%s.pdf" % wert, "wb")
sollte man Dir den Code um die Ohren hauen. Use the [mod]os.path#os.path.join[/mod] force.

Nur so eine Vermutung, lass Dir mal sowohl nach der Erstellung, als auch im nachfolgenden (vor dem Zugriff) auf die PDF-Datei den Pfad ausgeben (bzw. besser: loggen), mit dem Du arbeiten willst und vergleich beide mal.

>>Masaru<<

Verfasst: Dienstag 26. Januar 2010, 13:40
von Pekh
Existiert 'tempdir' denn?

Re: probleme mit import

Verfasst: Dienstag 26. Januar 2010, 13:40
von /me
mathi hat geschrieben:Ich hoffe ich konnte mich verständlich machen,
Klar wird mir das nicht wirklich. Woher kennt func() die Variable tempdir? Warum erzeugst du in der Funktion die Variable create wenn du sie nicht verwendest? Warum schließt du die Datei nicht wieder? Woher weißt du, dass der Fehler in func() erzeugt wird? Was bedeutet es wenn du sagst, dass du das Programm über ein Steuerprogramm aufrufst?

Re: probleme mit import

Verfasst: Dienstag 26. Januar 2010, 13:45
von Masaru
/me hat geschrieben:.. Klar wird mir das nicht wirklich. Woher kennt func() die Variable tempdir? ...
Vermutlich eine Variable auf Modulebene (nicht schön, aber auch nichts aussergewöhnliches ... aber würde in Analogie zum Verzeichnispfad joinen via String-concats passen).

@mathi:
Hilfreich wäre wirklich ein wenig mehr Code. (:!: Bitte nach http://paste.pocoo.org/ oder ähnliche Pastebinm ausgelagert)

Verfasst: Dienstag 26. Januar 2010, 14:30
von mathi
ich habe versucht, die Erklärung auf das Wesentliche zu beschränken.....

"tempdir" existiert,

hat etwas gedauert, die doch komplexen Programmteile auszudünnen, einzig lauffähig ist das Steuerprogramm..
http://paste.pocoo.org/show/9CrSoKtu66KiZ9jRHVFQ/

mit diesem starte ich das Programm (nicht lauffähig, nur Auszüge)
http://paste.pocoo.org/show/L1wI68lNww3mNyP9LZN5/

darin wird in processes func() verwendet
http://paste.pocoo.org/show/RIgA7VZgjqo9pHn1o7Kp/

wenn ich das programm direkt starte gehts, wenn ich über Steuerprogramm starte gehts nicht, was mich wundert, denn ich importiere je eigentlich über den gleichen Weg....

Ich hoffe jetzt wird's klarer..

Gruß Mathi

Verfasst: Dienstag 26. Januar 2010, 14:41
von Masaru
Was verbirgt sich denn hinter pdfs?:
[L.34] - http://paste.pocoo.org/show/L1wI68lNww3mNyP9LZN5/

Code: Alles auswählen

pdfs.append(self.tempdir+'\\document%s.pdf' % nr)
Bzw. was machst Du mit der (scheinbaren) Liste von Strings. Nur durch das "append"en der Pfadnamen werden die Files ja nicht erzeugt.

>>Masaru<<

Verfasst: Dienstag 26. Januar 2010, 14:46
von mathi
nein, nein erzeugt werden die pdf's ja in func()

[L.6] - http://paste.pocoo.org/show/RIgA7VZgjqo9pHn1o7Kp/

das Programm arbeitet mit Processen, d.h. je Prozessorkern wird ein Prozess erzeugt, der wiederum eine .pdf erzeugt (dokument0.pdf, dokument1.pdf bei einem DualCore)

natürlich hast Du recht

Code: Alles auswählen

pdfs=[] 
sollte da noch stehen, habe ich beim löschen eine Zeile zu viel erwischt.

funk() wird also pro Process aufgerufen.
Leider kann ich in func() auch keine kontroll-prints einbauen, weil diese Prints nicht ausgeführt werden,
egal ob ich die lauffähige Variante starte (direkt Programm)
oder über Steuerprogramm (muß was mit multiprocessing zu tun haben)

Verfasst: Dienstag 26. Januar 2010, 15:08
von Masaru
Mit multiprocessing hat das vermutlich recht wenig zu tun, Du meinst vermutlich threading, oder benutzt Du multiprocessing Techniken?

Also ... puh ... mit den "unvollständigen" (bzw. ich würde es eher schon als "kaputten") Code-Krümpchen kann man soviel anfangen, wie mit einer Gabel zu versuchen einen Teller Suppe auszulöffeln.
Du lieferst jetzt die Liste pdfs zwar nach, doch verrät der Code nirgends, dass diese Liste in einem Deiner Prozess-Instanzen übergeben und ausgeführt wird.

Gemäß der Snippsel die Du geliefert hast, würde ich ganz brutal sagen: es grenzt schon fast an ein Wunder, dass überhaupt etwas funktioniert!

>>Masaru<<

Verfasst: Dienstag 26. Januar 2010, 15:20
von snafu
@mathi:

Wäre es wirklich so ein großes Problem, die tatsächlichen Namen der Funktionen und den tatsächlichen Code zu zeigen? Woran haperts denn? Ist der Code aus einem Closed-Source Projekt und eine Veröffentlichung würde dir Schwierigkeiten machen oder ist er dir zu peinlich? Letzteres muss IMHO nicht sein. Man ist hier, um etwas zu lernen. Keiner ist als Python-Gott auf die Welt gekommen usw.

Verfasst: Dienstag 26. Januar 2010, 15:27
von mathi
da möchte ich auf http://www.python-forum.de/topic-21172,45.html letztes Posting verweisen,

ich habe danach die Variablen umbenannt vgl:

http://paste.pocoo.org/show/MhntaNjhTB63vZywedoD/

darin soll nun
def merge()
ausgelagert werden in eine eigene Datei.

ich hab es halt
def func()
genannt damit es (un)klarer wird.

@snafu:

für meinen wx Code habe ich hier schon mehrfach Schelte bekommen, falls es mit den jetzigen schnippseln nicht geht, poste ich alle 3 Dateien im Vollen (sind halt einige Module wie reportlab und pypdf erforderlich...., ist halt evtl. etwas unübersichtlich aber für Hilfe wäre ich schon dankbar.....

Verfasst: Dienstag 26. Januar 2010, 17:55
von Dav1d
verwende "with" :lol:

und die Datei mit open() statt file() öffnen

Verfasst: Mittwoch 27. Januar 2010, 08:25
von mathi
gelöscht, weil es nichts zur Sache tut....

Mathi

Verfasst: Mittwoch 27. Januar 2010, 09:31
von BlackJack
Ich frage mich gerade wie "sicher" das `pdfPage`-Exemplar existiert wenn man es nur erstellt und nicht dauerhaft referenziert!? Das ist zumindest ein Unterschied zwischen den beiden Programmen.

Ansonsten könntest Du mal über `logging` oder zumindest ein paar ``print``\s nachdenken, die an den strategisch interessanten Stellen Informationen ausgeben. Mit welchen kompletten Namen werden die PDFs erstellt, mit welchen versucht `merge()` darauf zuzugreifen; wann werden die Dateien wieder gelöscht; usw.

Verfasst: Mittwoch 27. Januar 2010, 10:07
von mathi
Danke für die Antwort, jetzt habe ich den Fehler eingrenzen können:

es liegt an meiner Art den SplashScreen im Hauptprogramm einzubinden....

Warum das falsch ist weiß ich nicht,
hier nochmal das komplette Steuerprogramm:
http://paste.pocoo.org/show/bEjDK1jRZBxQ1NYtsxzl/
Darin starte ich den Splash und möchte erst nach beenden des Splah die initialisierung des Frames starten, daher starte ich den Frame durch einen evt.Close() in class SplashScreen

Gruß Mathi