Seite 1 von 1

popen4 problem

Verfasst: Dienstag 17. Juni 2008, 15:29
von cycloneIII
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

Verfasst: Dienstag 17. Juni 2008, 15:32
von Leonidas
Du solltest generell mal popen* durch subprocess ersetzen. Schau mal ob es dadurch besser wird.

Verfasst: Dienstag 17. Juni 2008, 15:33
von BlackJack
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.

quelltext

Verfasst: Dienstag 17. Juni 2008, 15:40
von cycloneIII
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....

Re: quelltext

Verfasst: Dienstag 17. Juni 2008, 15:45
von Leonidas
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.

Verfasst: Dienstag 17. Juni 2008, 15:52
von cycloneIII
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

Verfasst: Dienstag 17. Juni 2008, 15:59
von Leonidas
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".

Verfasst: Dienstag 17. Juni 2008, 17:01
von cycloneIII
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:

Verfasst: Dienstag 17. Juni 2008, 17:01
von BlackVivi
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

Verfasst: Dienstag 17. Juni 2008, 17:16
von Leonidas
BlackVivi hat geschrieben:Volltextsuche =D
Also mit der Titelsuche gehts auch:
http://wiki.python.de/?action=fullsearc ... rch=Titles

Verfasst: Mittwoch 18. Juni 2008, 06:11
von cycloneIII
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...

Verfasst: Mittwoch 18. Juni 2008, 08:07
von audax
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()

Verfasst: Mittwoch 18. Juni 2008, 08:51
von cycloneIII
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 :-)

Verfasst: Mittwoch 18. Juni 2008, 10:35
von mkesper
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.