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
popen4 problem
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.
-
- User
- Beiträge: 6
- Registriert: Dienstag 17. Juni 2008, 15:24
bei button click wird folgendes aufgerufen:
inhalt info2.py
das mit subprocess hat nicht funktioniert....
Code: Alles auswählen
os.popen4("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()
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Du musst in deinem subprocess-Call das ``<`` durch ein ``<=`` ersetzen.cycloneIII hat geschrieben:das mit subprocess hat nicht funktioniert....
Sprich: nicht funktioniert ist keine angemessene Problembeschreibung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 6
- Registriert: Dienstag 17. Juni 2008, 15:24
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
sorry bin python anfänger und das was ich mit subprocess gecodet hab war mist...
grüsse
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Schau ins Wiki unter "Neue Features".cycloneIII hat geschrieben:wie soll das ganze statement dann aussehen, also anstatt der Zeile os.popen4("info2.py") schreibe ich dann???
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 6
- Registriert: Dienstag 17. Juni 2008, 15:24
hmm ich glaub ich bin zu blöd...aber im wiki fand ich weder neue features noch liefert die suche ergebnisse für subprocess!?!?
http://wiki.python.de/?action=fullsearc ... earch=TextcycloneIII 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!?!?
Volltextsuche =D
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Also mit der Titelsuche gehts auch:BlackVivi hat geschrieben:Volltextsuche =D
http://wiki.python.de/?action=fullsearc ... rch=Titles
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 6
- Registriert: Dienstag 17. Juni 2008, 15:24
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 weggelassen aber er "hängt" in der schleife...
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()
Ich hab nen kurzen Verbesserungsvorschlag:
Und das range-len Ding kann man sich immer(!) sparen. Wenn man den Index noch braucht, dann nutzt man eben enumerate()
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)
-
- User
- Beiträge: 6
- Registriert: Dienstag 17. Juni 2008, 15:24
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:
zum terminieren:
danke nochmal an alle, verbesserungsvorschlag wurde auch schon umgesetzt
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
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)
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
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.
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.