popen4 problem

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
cycloneIII
User
Beiträge: 6
Registriert: Dienstag 17. Juni 2008, 15:24

Dienstag 17. Juni 2008, 15:29

Hi

ich öffne in einer python datei mit dem befehl popen4 eine weitere python datei...in dieser mit popen geöffneten datei wird mit einer while(1) schleife ein FIFO ausgelesen und direkt in eine datei geschreiben. mein problem ist nun das er den subprocess nach einer dateigrösse von 4KB, exakt 4096 Bytes wieder zu schliessen scheint da die datei immer exakt die gleiche grösse hat.

gibt es eine möglichkeit dies zu ändern oder an was liegt das? die datei sollte nämlich schon 200-300mb gross werden können...

greetz
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. Juni 2008, 15:32

Du solltest generell mal popen* durch subprocess ersetzen. Schau mal ob es dadurch besser wird.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Dienstag 17. Juni 2008, 15:33

Ohne Quelltext zu sehen, kann man da nicht viel sagen. Ich vermute die Schleife wird nach dem lesen abgebrochen, warum auch immer, und Du hast damit nur den Inhalt, der in einen IO-Puffer gepasst hat.
cycloneIII
User
Beiträge: 6
Registriert: Dienstag 17. Juni 2008, 15:24

Dienstag 17. Juni 2008, 15:40

bei button click wird folgendes aufgerufen:

Code: Alles auswählen

os.popen4("info2.py")
inhalt info2.py

Code: Alles auswählen

import udp
import time
import sys
import codecs

# Encoding der Standardausgabe herausfinden
stdout_encoding = sys.stdout.encoding or sys.getfilesystemencoding()

IP="192.168.0.115"
udp.create()
str="%f"%(time.time())
f = codecs.open("output_" + str + ".txt", "w", "utf-8")
while 1:
                udp.read()
                for i in range(len(udp.extra_data)):
                        torque=	udp.extra_data[i][0]
                        height=	udp.extra_data[i][1]
                        target=	udp.extra_data[i][2]
                        positi=	udp.extra_data[i][3]
                        pid_p =	udp.extra_data[i][4]
                        pid_i =	udp.extra_data[i][5]
                        pid_d =	udp.extra_data[i][6]
                        clk   =	udp.extra_data[i][7]


                        print "%.3f\t%i\t%i\t%i\t%i\t%i\t%i\t%i"%( \
                                torque, \
                                height, \
                                target, \
                                positi, \
                                pid_p , \
                                pid_i , \
                                clk , \
                                pid_d)
                                # Datei schreiben
                                # message = torque & ";" &  height & ";" &  target & ";" & positi & ";" & pid_p & ";" & pid_i & ";" & clk & ";" & pid_d
                        message = "%.3f\t%i\t%i\t%i\t%i\t%i\t%i\t%i\n"%( \
                                torque, \
                                height, \
                                target, \
                                positi, \
                                pid_p , \
                                pid_i , \
                                clk , \
                                pid_d)
                        f.write(message)
                                
                print "---------------------------------"
f.close()
das mit subprocess hat nicht funktioniert....
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. Juni 2008, 15:45

cycloneIII hat geschrieben:das mit subprocess hat nicht funktioniert....
Du musst in deinem subprocess-Call das ``<`` durch ein ``<=`` ersetzen. :twisted:

Sprich: nicht funktioniert ist keine angemessene Problembeschreibung.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
cycloneIII
User
Beiträge: 6
Registriert: Dienstag 17. Juni 2008, 15:24

Dienstag 17. Juni 2008, 15:52

ok sorry, da hab ich was ganz verrafft, wie soll das ganze statement dann aussehen, also anstatt der Zeile os.popen4("info2.py") schreibe ich dann???
sorry bin python anfänger und das was ich mit subprocess gecodet hab war mist...

grüsse
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. Juni 2008, 15:59

cycloneIII hat geschrieben:wie soll das ganze statement dann aussehen, also anstatt der Zeile os.popen4("info2.py") schreibe ich dann???
Schau ins Wiki unter "Neue Features".
My god, it's full of CARs! | Leonidasvoice vs Modvoice
cycloneIII
User
Beiträge: 6
Registriert: Dienstag 17. Juni 2008, 15:24

Dienstag 17. Juni 2008, 17:01

hmm ich glaub ich bin zu blöd...aber im wiki fand ich weder neue features noch liefert die suche ergebnisse für subprocess!?!? :roll: :shock:
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Dienstag 17. Juni 2008, 17:01

cycloneIII hat geschrieben:hmm ich glaub ich bin zu blöd...aber im wiki fand ich weder neue features noch liefert die suche ergebnisse für subprocess!?!? :roll: :shock:
http://wiki.python.de/?action=fullsearc ... earch=Text

Volltextsuche =D
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. Juni 2008, 17:16

BlackVivi hat geschrieben:Volltextsuche =D
Also mit der Titelsuche gehts auch:
http://wiki.python.de/?action=fullsearc ... rch=Titles
My god, it's full of CARs! | Leonidasvoice vs Modvoice
cycloneIII
User
Beiträge: 6
Registriert: Dienstag 17. Juni 2008, 15:24

Mittwoch 18. Juni 2008, 06:11

hehe ja ich war gestern wohl einfach schon zu verpeilt...nach dem ganzen probieren...danke.

also das mit dem subprocess funktioniert zwar. allerdings hat es nicht den gewünschten effekt. wie oben im quelltext zu sehen ist hat das programm das aufgerufen wird eine while(1) schleife. ich möchte nun das beim starten des subprocesses das andere stammprogramm trotzdem noch aktiv ist und reagiert und nicht wartet bis der subprocess abgearbeitet ist, das wird ja niemals sein. der subprocess soll aber natürlich trotzdem weiterlaufen, aber halt quasi im hintergrund...

habe auch extra das

Code: Alles auswählen

process.wait()
weggelassen aber er "hängt" in der schleife...
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Mittwoch 18. Juni 2008, 08:07

Ich hab nen kurzen Verbesserungsvorschlag:

Code: Alles auswählen

               for data in udp.extra_data:
                            # switch pid_d and clk
                            data[6], data[7] = data[7], data[6]

                            message ="%.3f\t%i\t%i\t%i\t%i\t%i\t%i\t%i"% data
                            print message
                            f.write(message) 
Und das range-len Ding kann man sich immer(!) sparen. Wenn man den Index noch braucht, dann nutzt man eben enumerate()
cycloneIII
User
Beiträge: 6
Registriert: Dienstag 17. Juni 2008, 15:24

Mittwoch 18. Juni 2008, 08:51

heyho

so nun läuft alles das problem lag am programm des subprocess selbst, habe den fehler nun behoben und alles funktioniert. ausserdem kann ich den subprocess nun auch per button beenden, hier mal der code falls jemand mal dasselbe problem hat:

subprocess erstellen:

Code: Alles auswählen

import subprocess

str = "argument for info3.py"
process = subprocess.Popen(['python.exe ', 'info3.py ', str])
number = process.pid

zum terminieren:

Code: Alles auswählen

import ctypes

PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, number)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)
danke nochmal an alle, verbesserungsvorschlag wurde auch schon umgesetzt :-)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Mittwoch 18. Juni 2008, 10:35

Funktioniert so nur unter Windows, so kann man plattformunabhängig Subprozesse killen. Interessant vielleicht auch die ganze Diskussion zu subprocess bzw. non-blocking pipes.
EDIT: In dem Thread steht auch, daß es eine neue Version von subprocess gibt, die die nötigen Methoden mitbringt. Unter 2.4 bzw. 2.5 müßte man sich das Modul allerdings aus der 2.6er importieren, da es hier keine zusätzliche Funktionalität mehr geben wird.
Antworten