Python frage eines newbi

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.
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hi. Da bin ich wieder.
(Mußte noch Zope installieren)
Danke Voges für deine Hilfe. Das Programm läuft jetzt ohne Probs durch.
Also kann man sagen das der Grundalgorhytmus steht.

Allerdings soll es ja eine Web Applikation werden.
Ich hab erstmal eine ganz einfache HTML Seite Programmiert wo man in einem edit fenster den Monat oder die gewünschte Seite eingeben kann.
Also das was ich bisher über die Kommandozeile eingegeben hab.
Seh ich das richtig das ich mit jetzt Gedanken machen muss wie die Eingabedaten an Python ,mittels CGI Skript übergeben werden?
Ist es auch so einfach möglich auf die orginal log Dateien zuzugreifen die ja auf dem Serverliegen mittels Pfadangabe?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:Seh ich das richtig das ich mit jetzt Gedanken machen muss wie die Eingabedaten an Python ,mittels CGI Skript übergeben werden?
Ist es auch so einfach möglich auf die orginal log Dateien zuzugreifen die ja auf dem Serverliegen mittels Pfadangabe?
Dein Python-Script liegt ja ebenfalls auf dem Server. Wenn also der Webserver für das Ausführen von Python-Scripten konfiguriert ist und Du entsprechende Rechte hast, sollte das kein Problem sein.

Zum Thema CGI mit Python gibt es in der Library Reference unter 11.2 cgi -- Common Gateway Interface support einiges an Informationen.

Wenn wir weiterhin im diesem Thread bleiben, ist das ok. Aber ansonsten ist CGI im Netzwerkforum weiter unten on-topic.

Jan
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo!
Ja da bin ich wieder hier. Hab mich entschieden weiter unter diesem Thread zu schreiben damit vieleicht auch andere das Projekt besser nachvollziehen können.
Ich hab jetzt ziemlich viel über CGI gelesen und auch nen bißchen schon probiert.
Ich hab aber jetzt einen neuen Denkansatz bekommen. Und zwar muss ich überhaupt CGI verwenden? Gibt es nicht einfachere Methoden in Bezug auf Zope Aplikation Server, HTML und meinem Python Quelltext?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Calanetics,

Du kannst in Zope auch ein externes Script einbinden, dies ist auf http://www.dzug.org/ZopeBuch/ZWiki/ZBScriptingZope weiter unten beschrieben.


Gruß

Dookie
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo.
Da bin ich wieder nachdem ich mal ne Woche hin und her probiert hab mit Zope.
Leider hab ich schon wieder nen Problem:(
Ihr kennt bestimmt noch mein Programm das alle Seiten aus der Log Datei und die Zugriffe zählt.
Ich hab jetzt die log txt hochgeleladen auf zope und nur zum testen mal folgendes Zope skript geschrieben.

Code: Alles auswählen

<dtml-var standard_html_header>
<center><h2><br>Diese Seite ermittelt für Sie irgent etwas Monats abhängiges.</h2>
<h1><br></h1> <h3>
<form action="aktionsSkript">
           Bitte Monat eingeben. <input type="text" name="name"><br><br></h3>
        <input type="submit">
        <input type=reset value="Eingabe löschen"> 
        <input type=button value="Zur&ck" onClick="history.back()">
</center>
      </form>
        
<dtml-var standard_html_footer>
und das flogende python skript

Code: Alles auswählen

# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE =  request.RESPONSE

d1 = {'September' : 'test.txt', 
      'Oktober' : 'test1.txt'}
f =open (d1[name], 'r')       
d ={} 
for line in f.readlines(): 
    linearray = line.split("|") 
    if linearray[3] == " view " : 
        d[linearray[4]] = 0 

for s in d.keys(): 
    zaehler = 0 
    z1 = 0 
    z2 = 0 
    f.seek(0) 
    for line in f.readlines():   
        linearray = line.split("|") 
        if linearray[3] == " view " and linearray[4] == s: 
                                                         
            zaehler += 1 
            if linearray[6].startswith(' 193.175.240') or linearray[6].startswith(' 172.30.30') or linearray[6].startswith(' 192.168'): 
                z1 += 1 
            else: 
                z2 +=1 

    print "Auf die Seite" ,s, "wurde", zaehler, "mal zugegriffen. " "Intern:",z1, " Extern:",z2
                


return printed

mein problem ist zum einen es läuft mal wieder nicht.
jedes mal kommt jetzt der Fehler open ist not definied.
hat jemand ne Idee ? wo hier der Fehler ist?
Und Dookie DTML war nen super Tipp.
Ok Vielen Dank bis danni
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Gib mal bitte die genaue Fehlermeldung an... in der Zeile mit open stimmt was nicht, da hat Python schon recht, aber ich denk mal viel eher, das "name" nicht definiert ist :wink:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

open ist wohl innerhalb von Zope nicht erlaubt. Da musst Du mit einem externen Script arbeiten, wie das geht ist hier http://www.dzug.org/ZopeBuch/ZWiki/ZBScriptingZope unter "Externe Scripte benutzen" beschrieben.


Gruß

Dookie
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo!

Da bin ich wieder und hab leider wieder ein Problem!
Das folgende Skript hab ich extern unter Zope eingebunden.

Code: Alles auswählen



def Seite(x):                              
    
    f =open ("C:/windows/temp/test.txt", 'r')                                 
    zaehler = 0 
    z1 = 0 
    z2 = 0 
    for line in f.readlines():                                                 
        linearray = line.split("|") 
        if linearray[3] == " view " and linearray[4].strip() == x:                           
            zaehler += 1                                                    
            if linearray[6].startswith(' 193.175.240') or linearray[6].startswith(' 172.30.30') or linearray[6].startswith(' 192.168'): 
                z1 += 1 
            else: 
                z2 +=1 

    f.close() 
    return "Auf die Seite ", x,"wurde",zaehler,"mal zugegriffen. "" Intern: ",z1," Extern:",z2






Das Problem ist das irgendwie der Pad auf die Log Datei Test.txt nicht stimmt egal was ich probier
bekomm ich immer die Fehlermeldung "Can't find such file!" hatte die Datei schon direkt im Ordner folder oder auch im Extensions Ordner.
Ich hoffe mir kann jemand weiter helfen.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Musst Du unter Windows nicht den Backslash nehmen statt dem Slash im Pfad?
gast

hi,

funzt das so

Code: Alles auswählen

f =open (r'C:/windows/temp/test.txt', 'r')
gruß
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Dookie hat geschrieben:Musst Du unter Windows nicht den Backslash nehmen statt dem Slash im Pfad?
nein -- Python ist das egal, es funktionieren beide Varianten.
gast hat geschrieben:hi,

funzt das so

Code: Alles auswählen

f =open (r'C:/windows/temp/test.txt', 'r')
gruß
Sieht das dann nicht eher so aus, wenn schon Backslash? :wink: Für normale Slash's braucht man ja keine Raw Strings.

Code: Alles auswählen

f =open (r'C:\windows\temp\test.txt', 'r')
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Milan hat geschrieben:nein -- Python ist das egal, es funktionieren beide Varianten.
Aber kommt denn die Fehlermeldung überhaupt von Python? Die lautet doch in der Regel IOError: [Errno 2] No such file or directory: 'foo'. Hab' aber von Zope keine Ahnung.
Jan
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hi Voges.
Ja der Fehler kommt von Python genau der den dun genannt hast.
Zope bindet das Skript problemlos ein und arbeitet dann auch damit.
Nur beim Dateien öffnen findet er jetzt die test.txt nicht egal wo sie auf dem Zope Server abgelegt ist.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Nur so eine Idee, versuchs mal mit einer URI in der Form "file:///C:/eirgendwo/test.txt"


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:Ja der Fehler kommt von Python genau der den dun genannt hast.
Bitte immer genau angeben. Wenn Du schreibst 'bekomm ich immer die Fehlermeldung "Can't find such file!"', dann geht man davon aus, das die Meldung auch exakt so lautet.

2 Vorschläge:
- Mach unmittelbar vor'm open() mal ein os.listdir("C:/windows/temp/"), um zu sehen, ob in der Liste die "test.txt" auch auftaucht.
- erzeuge über das Script mal eine Datei mit dem selben Pfad. Dann kannst Du ja über die Windows-Suchfunktion gucken, wo sie abgeblieben ist (falls Dateien überhaupt angelegt werden dürfen).

Jan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Ich kenne zwar Zope nicht, aber kann es sein, dass Zope ähnlich Apache ein RootDirectory definiert? dieses Directory wäre dann in der Folge als / anzugeben.

Bei externen Scripts außerhalb von Zope, müßte dann der Pfad wieder ergänzt werden. Nur mal so als Idee.......

Hans
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hi Leute.
Danke nochmal für die Hilfe hab jetzt das Problem hinbekommen und da hat besonders Voges sein Tipp geholfen.
Mein Programm läuft jetzt auch super nur optisch ist es noch ncht ganz so schön und zwa bei folgendem Text:

Code: Alles auswählen

def Seite(x):                             
   
    f =open ("C:/windows/temp/test.txt", 'r')                                 
    zaehler = 0
    z1 = 0
    z2 = 0
    for line in f.readlines():                                                 
        linearray = line.split("|")
        if linearray[3] == " view " and linearray[4].strip() == x:                           
            zaehler += 1                                                   
            if linearray[6].startswith(' 193.175.240') or linearray[6].startswith(' 172.30.30') or linearray[6].startswith(' 192.168'):
                z1 += 1
            else:
                z2 +=1

    f.close()
    return "Auf die Seite ", x,"wurde",zaehler,"mal zugegriffen. "" Intern: ",z1," Extern:",z2
und zwar erscheint dann immer flogende ausgabe:

('Auf die Seite ', Seite,'wurde',zaehler,'mal zugegriffen. '' Intern: ',z1,' Extern:',z2')

Ich hab schon ne Menge versucht damit diese Klammern und hochkommas verschwinden. in der python shell klappt es aber dort kann man auch return weglassen und brauch nur print schreiben.

Ich hoffe es kann mir jemand weiterhelfen.
Machsts jutii
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:Danke nochmal für die Hilfe hab jetzt das Problem hinbekommen und da hat besonders Voges sein Tipp geholfen.
Wäre schon interessant, wodran es nun gelegen hat.
Calanetics hat geschrieben: ('Auf die Seite ', Seite,'wurde',zaehler,'mal zugegriffen. '' Intern: ',z1,' Extern:',z2')

Ich hab schon ne Menge versucht damit diese Klammern und hochkommas verschwinden. in der python shell klappt es aber dort kann man auch return weglassen und brauch nur print schreiben.
An den "Klammern und Hochkommas" solltest Du eigentlich sofort erkennen, dass Du es nicht mit einem String, sondern mit einem Tupel zu tun hast. return macht etwas deutlich anderes als print (siehe Doku).
Mal ganz allgemein: Rumprobieren ist ein schlechter Lehrer, wenn es um's Programmieren geht. Die Grundlagen von Python solltest Du schon kennen oder zumindest fehlendes Wissen anhand der Doku Dir problemlos aneignen können.
Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

so gibst Du ja auch mit dem return ein Tuple zurück, versuchs mal so:

Code: Alles auswählen

return "Auf die Seite "+str(x)+" wurde "+str(zaehler)+" mal zugegriffen. Intern: "+str(,z1)+" Extern:"+str(z2)
oder so

Code: Alles auswählen

 return "Auf die Seite %s wurde %i mal zugegriffen.\nIntern: %i Extern: %i" % (x, zaehler, z1, z2)

Gruß

Dookie
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Moin, Moin!
Danke hat alles supi geklappt!
Voges zu dem Problem mit der Pfadangabe unter Zope hab ich einfach deinen Trick benutzt und hab geschaut wo eine neue Datei angelegt wird.
Und zwar wird sie in dem Ordner Var unter Zope angelegt wo ich jetzt auch die logs hingeschoben hab.
Nur mal als kleine Zwischenfrage: Um mein Programm noch runder zu machen würd ich gern die orginal logs in den Ordner var kopieren.
Geht das so einfach mit import.
Irgednwie ist zu diesem Thema nicht viel zu finden. Vielleicht ist es ja auch selbsterklärend und ich bin wieder nicht so clever:)

Aber mein eigentliches Prob ist bei folgendem Quelltext.

Code: Alles auswählen

import string
def Monat(x):    
    d1 = {'September' : 'C:/windows/temp/test.txt', 
          'Oktober' : 'C:/windows/temp/test1.txt'} 
                                                
    f =open (d1[x], 'r')       
    d ={}
    d2 = []
    for line in f.readlines(): 
        linearray = line.split("|") 
        if linearray[3] == " view " : 
            d[linearray[4]] = 0 

    for s in d.keys(): 
        zaehler = 0 
        z1 = 0 
        z2 = 0 
        f.seek(0) 
        for line in f.readlines():   
            linearray = line.split("|") 
            if linearray[3] == " view " and linearray[4] == s: 
                                                         
                zaehler += 1 
                if linearray[6].startswith(' 193.175.240') or linearray[6].startswith(' 172.30.30') or linearray[6].startswith(' 192.168'): 
                    z1 += 1 
                else: 
                    z2 +=1 
        
        
        d2.append('Auf die Seite %s wurde %i mal zugegriffen werden. Intern: %i Extern: %i' % (s, zaehler, z1, z2))
             
    
    return string.join(d2, '\n')
Und zwar geb ich ja eine Liste zurück die ich schon nen bißche bearbeite bei der Ausgabe.
Doche leider macht er keine Zeilenumbrüche nach jeder Zeile obwohl ich doch \n angeb!

Ich hoffe es kann mir jemand weiterhelfen.
Antworten