probleme mit import

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
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Existiert 'tempdir' denn?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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?
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

/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)
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
Zuletzt geändert von Masaru am Dienstag 26. Januar 2010, 14:55, insgesamt 1-mal geändert.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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)
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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.....
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

verwende "with" :lol:

und die Datei mit open() statt file() öffnen
the more they change the more they stay the same
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

gelöscht, weil es nichts zur Sache tut....

Mathi
Zuletzt geändert von mathi am Mittwoch 27. Januar 2010, 16:35, insgesamt 2-mal geändert.
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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

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
Antworten