OHwei, wer kann mir helfen? Bitte

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Achtung, zu Python2.4 gibts aber noch nicht sehr viele Thirdpartymodule, das wird wohl noch etwas dauern, empfehlenswert ist Python2.3 zu nehmen. Falls das nicht geht, weil das script auf einem Server laufen soll zu dem du keinen Rootzugriff hast, verwende die Zuweisung Am Anfang Deines Scripts.

Code: Alles auswählen

try:
    True
except NameError:
    False, True = 0, 1

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Falls du doch mal nen aktuelleres Linux probieren/installieren willst, schau dir mal ubuntu an.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Code: Alles auswählen

  File "xmlparser.py", line 22
    nums=[num for num in nodeline.split() if num!=""]
                         ^
SyntaxError: invalid syntax
Mhm ich glaub ich muss was ganz ganz einfaches schreiben, ich versuch mir das jetzt selber aus den Finger zu saugen, egal wie quick&dirty es ist.

Also fangen wir mit den "Basics" an. Leider hab ich das Pythonbuch des Kollegen net hier, das würd mir sehr weiterhelfen.

Ich öffne ne Datei und mach
zeilen = infile.readlines()

Wie kann ich nun auf ein einzelne Zeile zugreifen? Klappt da zeile[index] oder ähnliches?
Und nun nehmen wir an, ich hab in habe in der zehnten Zeile 1 Calibartion möchte nun 1 Zeile adden wie ginge das?
Den rest denke ich könnt ich mir selber basteln, sprich Erkennungsmechanismus, etc
Gast

Ich werd mich nur hüten und an dem System IRGENDETWAS machen, was den Betrieb beinflussen könnte. Schon allein unser Sysadmin (ja und der kennt sich mit Linux aus) hat geschlagene 3 Stunden gebraucht um Samba zu installieren, leigt wohl an dem doofen Realtimekernel
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Code: Alles auswählen

nums=[num for num in nodeline.split() if num!=""]
ist eine Listcomprehension, die gibts erst seit Python 2.2 oder 2.3, also wohl auch nicht bei Deiner Pythonversion. Welche Version du hast bekommst du mit einem einfachen python in der Console raus.

Hier im Forum ist Python2.3 eigentlich schon voraussetzung, das viele Sachen laufen. Es gibt auch schon erste Posts mir Lösungen für Python2.4. Schmeiss suse runter und installier ein richiges Linux, dann geht das updaten von selber ;)


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

OMG zu HILFE!

Python 1.5.2 (#1, Aug 8 1999, 01:35:00) [GCC egcs-2.91.66 19990314/Linux (egcs
- on linux2

Und da frag ich mich wies die Entwickler geschafft haben ein dermassen komplexes System zu coden, wenns da netmal so Basics wie indizierte variablen oder boolsche variablen gibt o_o
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Nachtrag: Milans Lösung arbeitet mit Iteratoren, da könnte deine alte Pythonversion auch aussteigen.
Schmeiss deinen Sysadmin raus, wenn der eine uraltsuse nicht upgraden kann, ists mit der Sicherheit des Systems auch nicht weit her.


Dookie
[code]#!/usr/bin/env python
import this[/code]
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

Egal, ich weiss was ich mache.. Den Parser in Perl schreiben denke ich mal, und in den Python scripts nur überprüfen, ob die Datei modifiziert werden muss.

Wenn ja mach ich n os.system('xmlmodify.pl') sollte ja klappen oder?
Wie "halte" ich dann Python solange an, bis das Perlscript abgearbeitet ist?
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

Dookie das Problem ist nicht das updaten an sich. Die System hier laufen in nem geschlossenen Kreislauf also daran liegts net.
Nur sind das hier Industrie-PCs mit speziellen Modifikationen, wo schonmal ein BIOS-Update das USB-Support beinhaltet 15.000 Euro kostet.
Und du kannst dir vorstellen, welche Mühe es machen würde so ein System neu aufzusetzen, besonders da wir 365 Tage, 24/7 Betrieb haben
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Autsch! ...das tat weh. Ich erinner mich, dass ich selbst mal auf 1.4 gecodet habe bevor ich auf 2.2 umgestiegen bin. Meine Version darauf umzupacken ist mir zu dreckig, da veränder ich lieber mal Dookie seine (geht schneller). Das hier sollte auch laufen, obwohls weh tut:

Code: Alles auswählen

import string
try: 
    True 
except NameError: 
    False, True = 0, 1

def new_calib(line):
    pos = string.find(line,"0 ")
    repl = "1 " + str(int(line[pos+2:pos+4])+22)[:2]
    return string.replace(line,line[pos:pos+4], repl, 1)

infile = open("test.tst", "r")
outfile = open("testneu.tst","w")

chkflag = False
cline = ""
while True:
    line=infile.readline()
    if line=="":
        break
    if cline: # Zeile gemerkt? 
        if string.find(line,"</CALIB>") > -1: #schon Endtag? 
            line = new_calib(cline) + line # neue Zeile davor einfuegen 
        cline = "" # Zeile vergessen 
    if chkflag: 
        cline = line # Zeile Merken 
    outfile.write(line) 
    chkflag =  string.find(string.strip(line),"<CALIB") == 0 # naechste merken! 

outfile.close() 
infile.close()
Sodale, das müsste gehen.
mfG Milan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Wenn Du das oerlscript mit os.system startest, wartet das Pythonscript automatisch.
Folgende Version läuft auch mit Python2.1

Code: Alles auswählen

try:
    True
except NameError:
    False, True = 0, 1

def new_calib(line):
    """ Neue Zeile erzeugen """
    pos = line.find("0 ")
    repl = "1 " + str(int(line[pos+2:pos+4])+22)[:2]
    return line.replace(line[pos:pos+4], repl, 1)

infile = open("test.tst", "r")                                                 
outfile = open("testneu.tst","w")

chkflag = False
cline = ""                                       
for line in infile.readlines():
    if cline: # Zeile gemerkt?
        if line.find("</CALIB>") > -1: #schon Endtag?
            line = new_calib(cline) + line # neue Zeile davor einfuegen
        cline = "" # Zeile vergessen
    if chkflag:
        cline = line # Zeile Merken
    outfile.write(line)
    chkflag =  line.strip().startswith("<CALIB") # naechste merken!
    
outfile.close()
infile.close()
Falls die auch muckt mach ich eine Version für python1.5 ;)

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

hups, da war ich wieder schneller :wink: . Langsam find ich das lustig *hehe*
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

Was soll ich sagen? Grossartig, genial...

Der Tag ist gerettet. Oder eher das ganze Jahr :)))))


Super danke Euch beiden dass ihr Euch die Arbeit für n wildfremden gemacht habt.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hier noch die 1.5.2 version von mir:

Code: Alles auswählen

import string

try:
    True
except NameError:
    False, True = 0, 1

def new_calib(line):
    """ Neue Zeile erzeugen """
    pos = string.find(line, "0 ")
    repl = "1 " + str(int(line[pos+2:pos+4])+22)[:2]
    return string.replace(line, line[pos:pos+4], repl, 1)

infile = open("test.tst", "r")                                                 
outfile = open("testneu.tst","w")

chkflag = False
cline = ""                                       
for line in infile.readlines():
    if cline: # Zeile gemerkt?
        if string.find(line, "</CALIB>") > -1: #schon Endtag?
            line = new_calib(cline) + line # neue Zeile davor einfuegen
        cline = "" # Zeile vergessen
    if chkflag:
        cline = line # Zeile Merken
    outfile.write(line)
    chkflag =  string.strip(line)[:6] == "<CALIB" # naechste merken!
    
outfile.close()
infile.close()
Und mach dem Sysadmin Beine, damit er ein aktuelleres Python installiert, das Compilieren aus den Sourcen ist eigentlich recht problemlos möglich.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

Wie hiess es so schön? Never touch a running system :)

Mir ist es ja egal, meinetwegen läuft das System auf MS-DOS 3.30...
Und in 2 Jahren wirds wenns zeitmässig klappt eh abgelöst.
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

Dumme Frage noch, ich hoffe ich nerve net...
Kann mans so drehen, dass er das FIle gleich umändert und kein neues erzeugt? Ansonsten wenns zuviel Arbeit ist mach ich n normalen Movebefehl, auch net tragisch

Nachtrag: Haha wenigstens kennt meine Pythonversion schon nil :P
Aber ich verstehs dennoch net wieso es da noch keine Boolschen Variablen zb gibt, das hatte ja schon GW-Basic zu meinen einsteigerzeiten
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Code: Alles auswählen

import string
try:
    True
except NameError:
    False, True = 0, 1

def new_calib(line):
    pos = string.find(line,"0 ")
    repl = "1 " + str(int(line[pos+2:pos+4])+22)[:2]
    return string.replace(line,line[pos:pos+4], repl, 1)

dateiname="test.tst"
infile = open(dateiname, "r")
zeilen=infile.readlines()
infile.close()
outfile = open(dateiname,"w")

chkflag = False
cline = ""
for line in zeilen:
    if cline: # Zeile gemerkt?
        if string.find(line,"</CALIB>") > -1: #schon Endtag?
            line = new_calib(cline) + line # neue Zeile davor einfuegen
        cline = "" # Zeile vergessen
    if chkflag:
        cline = line # Zeile Merken
    outfile.write(line)
    chkflag =  string.find(string.strip(line),"<CALIB") == 0 # naechste merken!

outfile.close()
Und das mit den boolschen Ausdrücken: alles was leer ist gilt als False (also [],(),0,"",{}) und der Rest als True. Das ist verdammt praktisch, da man so leichter programmieren kann. Um trotzdem Formalität reinzubringen hat man dann noch einen Typ von int abgeleitet (bool), der dem ganzem einen Namen gibt aber sich notfalls wie eine Zahl (1 oder 0) verhält. Damit sind Tricks wie dieser möglich:

Code: Alles auswählen

zahl=5
a=("ungerade","gerade")[(zahl%2)==0]#a ist nun das was zahl ist
BKG
User
Beiträge: 7
Registriert: Montag 27. Dezember 2004, 16:48

File "obsbrowse.py", line 25
for line in zeilen
^
SyntaxError: invalid syntax

Lol ich glaub das System mag mich net :P

EDIT ne hat sich erledigt, ein leerzeichen zu viel. Bis ich da draufgekommen bin beim ersten Kontakt mit Python, dass Zeileneinschübe ne Rolle in der Abarbeitungsreihenfolge spielen :)

Habt dank wenn ich fertig bin poste ich den kompltten code, sobald er läuft ;:)
Gast

Code: Alles auswählen

#!/usr/bin/python
import os, string, sys, time, posix
s=string
from cgi import *
try:
    True
except NameError:
        False, True = 0, 1

def new_calib(line):
    pos = string.find(line,"0 ")
    repl = "1 " + str(int(line[pos+2:pos+4])+22)[:2]
    return string.replace(line,line[pos:pos+4], repl, 1)

def parse_xmlfile(filename):
    xml_inbox=posix.environ['CONTROL_INBOX']
    infile = open(xml_inbox + '/' + filename , "r")
    zeilen = infile.readlines()
    infile.close
    outfile = open(xml_inbox + '/' + filename , "w")
    chkflag = False
    cline = ""
    ismodified = False
    for line in zeilen:
           if cline: # Zeile gemerkt?
	      if string.find(line,"</CALIB>") > -1: #schon Endtag?
		  line = new_calib(cline) + line # neue Zeile davor einfuegen
	          ismodified = True
	      cline = "" # Zeile vergessen
	   if chkflag:
	      cline = line # Zeile Merken
	   outfile.write(line)
 	   chkflag =  string.find(string.strip(line),"<CALIB") == 0 # naechste merken!
    
    outfile.close()
    return ismodified


# cgi_dir='/cgi-bin/' # change according to your needs

def usage():
	print 'usage: obsbrowse.py <directory(=../inbox/)>'

def Main():
	import traceback
	import obseval
	# configure the evaluation module
	if len(sys.argv)==2:
		fromdir=sys.argv[1]
	try:
		xmlfiles=obseval.GetXMLFileList()
		print "Content-type: text/html\n\n"
        	print '<HTML><HEAD><TITLE>Observation Browser</TITLE></HEAD><BODY>'
		print '<H1>Folgende Beobachtungen wurden noch nicht ausgewertet:</H1>'
		print '<UL>'
		for i in xmlfiles:
		      modified = parse_xmlfile(i)	
		      if modified:
		          print '<LI><A HREF="auswertung.cgi?%s"> %s</A><font color=#008000> modifiziert</font>'%(i,i)
		      else:
		          print '<LI><A HREF="auswertung.cgi?%s"> %s</A>'%(i,i)
		print '</UL>'
		print '<H1>Bitte wählen Sie eine Beobachtung zur Auswertung aus</H1>'
	        print '</BODY></HTML>'
	except:
		print "Content-type: text/html\n\n"
        	print '<HTML><HEAD><TITLE>Error in obsbrowse.py </TITLE></HEAD><BODY>'
		print '<PRE> Calling sequence was %s</PRE>'%repr(sys.argv)
		print '<PRE> %s: %s</PRE>'%(sys.exc_type,sys.exc_value)
		print '<PRE>'
		traceback.print_exc()
		print '</PRE>'
	        print '</BODY></HTML>'

if __name__=='__main__':
	Main()

So fertig die ganze Geschichte danke Euch beiden :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ohh, ich habe jetzt einen so schoenen Thread verpasst :(

So, jetzt brauchen wir noch eine Version fuer das erste public release von Python :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten