Syntaxcheck bei Python

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
Alana
User
Beiträge: 3
Registriert: Donnerstag 9. Juli 2009, 09:36

Hallo

also ich bin totaler Programieranfänger, muss mich aber momentan ein bisschen mit dem Thema auseinandersetzten.

wie kann ich bei einem pythonskript einen Syntaxcheck ausführen ohne das Skript selber starten zu müssen? Also was ich bisher gemacht habe, IDLE öffen File > Open > Skript suchen ok. Dann öffnet sich ein zweites Fenster in dem das Skript aufgeführt ist. Wenn ich jetzt aber auf Run > Check Module gehe aktiviert sich die Python shell wieder und nichts passiert. ich weiss aber genau, dass in diesem Skript ein Fehler ist weiss aber nicht genau wo, was mach ich falsch?

danke

gruß
Alana
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Normalerweise sollte doch ein "Popup" erscheinen, das dir den Fehler anzeigt?
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Meine Kristallkugel sagt mir, dass dein Text nichts sagt ohne, dass du uns einen Schnipsel deines geheimnisvollen, vor unsichtbaren Fehlern überquellendem Quellcode zeigst :twisted: :twisted:
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Ich habe da mal vor nem Jahr für Pyedit was gebastelt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx

class test():
    def __init__(self):
        self.app = wx.App()
        self.app.MainLoop()
    
    def check_code(self, code):
        '''
        Prüft einen Programmcode auf Fehler
        erwaretet wird text (print "hallo")
        '''
        filename = "/tmp/temp_code.py"
        data = open("/tmp/temp_code.py", "w")
        for item in code:
            data.write(item)
        data.close()
        error = self.check(code, filename)
        if error:
            meldung = error[0] + "\n\nLinie" + error[2] + ">>>" + error[4] + "<<<"         
            wx.MessageDialog(parent = None, 
                             style = wx.ICON_ERROR, 
                             message = meldung, 
                             caption = "Syntax-Error").ShowModal()
    
    def check_file(self, file):
        '''
        Prüft einen Programmcode auf Fehler
        erwaretet wird ein Dateiname/Pfad
        '''
        filename = file
        code = open(filename).read()
        
        error = self.check(code, filename)
        if error:
            meldung = error[0] + "\n\nLinie" + error[2] + "  >>>" + error[4] + "<<<"         
            wx.MessageDialog(parent = None, 
                             style = wx.ICON_ERROR, 
                             message = meldung, 
                             caption = "Syntax-Error").ShowModal()
            
    
    def check(self, source, filename):
        try:
            compile(source, filename, "exec")
        except (SyntaxError, OverflowError), err:
            msg, (errorfilename, lineno, offset, line) = err
            return [msg, errorfilename, str(lineno), str(offset), line.replace("\n", "")]
        else:
            return None
t = test()
t.check_file("/home/andy/test.py")
Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
lunar

Die Klasse ist überflüssig, außerdem schließt du geöffnete Dateien nicht korrekt.
Alana
User
Beiträge: 3
Registriert: Donnerstag 9. Juli 2009, 09:36

SchneiderWeisse hat geschrieben:Normalerweise sollte doch ein "Popup" erscheinen, das dir den Fehler anzeigt?
ich habe nur zwei Fenster die PythonShell mit inhalt:
IDLE 1.2.4
>>>

und ein Fenster mit dem Quellcode selber, ein anderes Fenster öffnet sich nicht und in der Shell wird wie gesagt auch sonst nichts angeziegt.
jonas hat geschrieben:Meine Kristallkugel sagt mir, dass dein Text nichts sagt ohne, dass du uns einen Schnipsel deines geheimnisvollen, vor unsichtbaren Fehlern überquellendem Quellcode zeigst
der Quellcode überquillt nicht sondern, hat genau einen Fehler nämlich "cannot concatinate 'str' and 'long' objects", dies weiss ich, weil das skript ein Bestandteil von einem anderen Programm ist, der diesen Fehler ausspukt, leider sagt das Programm nicht in welcher Zeile sich der Fehler befindet. Und bei Knapp 200 Zeilen wäre diese Info schon hilfreich.
Eine Veröffentlichung ist nicht möglich, da das Programm nicht von mir ist und ich nicht weiss ob ich hier gegen irgendwelche Firmeninterne richtlinien verstossen würde. Mir gehts ausserdem grad nicht dadrum, den Quelltext selber zu verstehen oder zu analysieren sondern ob ich die Pythonshell richtig benutzt habe oder nicht oder ein anderes Programm zu finden, das mir sagt in welcher Zeile sich der Fehler befindet. Falls es sowas nicht gibt, hab ich halt pech gehabt, aber müsst ich wissen ;)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Fuehrst du das Programm auf der Kommandozeile aus, bekommst du - sofern das andere Programm den nicht verschluckt - einen kompletten Traceback, der dir auch zeigt in welcher Zeile es knallt.
Ich nehme mal an IDLE verschluckt den, generell halte ich es fuer keine gute Idee die Skripte in IDLE auszufuehren. Ich halte aber auch nichts von IDLE, deshalb kannst du das auch gerne ignorieren :twisted:

Daneben ist der Aufbau einer Testsuite empfehlenswert. Die sagt dir nicht nur wo syntaktisch etwas nicht stimmt, sondern auch wo semantisch etwas haenkt - sofern die Testsuite umfassend ist - wo ein Traceback meist den kuerzeren zieht.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

der Quellcode überquillt nicht sondern, hat genau einen Fehler nämlich "cannot concatinate 'str' and 'long' objects", dies weiss ich, weil das skript ein Bestandteil von einem anderen Programm ist, der diesen Fehler ausspukt, leider sagt das Programm nicht in welcher Zeile sich der Fehler befindet.
Das ist aber ein Laufzeitfehler, den kann man nur finden, wenn man dass Programm ausführt - "Check module" in IDLE macht anscheinend nur einen Syntax-check (Einrückung, Klammern, Anführungszeichen, etc.), und sowas wie 'a = "Hallo" + 14L' ist eben syntaktisch korrekt.

hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Alana
User
Beiträge: 3
Registriert: Donnerstag 9. Juli 2009, 09:36

@ Andyh

bei deinem Programm muss ich wohl wissen, was als Ausgabe erwartet wird oder? das ist schiwerig, weil es keine fixe ausgabe gibt.

@cofi

ich kann das Skript auch nicht so einfach in IDLE ausführen, da sonst Parameter fehlen. Ausführen geht nur in dem Programm das über den pythonscripten liegt. Vereinfacht gesagt, ich öffne das Programm, dann habe ich eine auswahl an verschiedenen Scripten wie zb einloggen.py, gib_mir_den_wert.py, ausloggen.py. Diese verschiedenen Skripte kann ich mir in einem Ordner des Programmes zusammensuchen wie ich es gerade brauche. um alles dann auszuführen werden aber noch parameter gebraucht, somit ziehe ich zb für einloggen.py noch einen wert "Anlage1" für gib_mir_den_wert.py den Wert "Zeile 1-15 " usw. danach gibts noch einen Button "ausführen". In dem Programm selber kann ich die einzelnen Skripte ansehen und editieren, aber selbst die zugewiesenen Werte werden in dem Skript nicht angezigt. und ein einzelnes Skript kann ich deshalb nicht in idle (oder anderen programmen) ausführen.
Vielleicht ist das einigermassen verständlich *g*.

Kannst du mir das mit dem Testsuite bitte näher erklären?

@b.esser-wisser

hmm wenn das so ist, dann ist meine Frage hier wohl beantwortet, warum das mit "check Module" nicht funkioniert Danke
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Alana hat geschrieben:ich kann das Skript auch nicht so einfach in IDLE ausführen, da sonst Parameter fehlen.
Dann musst du diese Paramter halt manuell übergeben...
Genau so würdest du auch bei einer Testsuite vorgehen. Vereinfacht ausgedrückt definierst du in einer Testsuite eine Reihe von Eingangsparametersätze (normalerweise Grenzfälle) und für jeden Parametersatz die Rückgabewerte, die du erwartest. Beim Ausführen der Testsuite wird jeder Parametersatz an das Modul übergeben und die Rückgabewerte mit den erwarteten verglichen. Wenn sie nicht übereinstimmen, ist der Test fehlgeschlagen.

Ansonsten lass mal pylint ( http://www.logilab.org/project/pylint ) über den Code laufen, der erkennt einige Fehler. pylint kann man auch automatisch in Eclipse integrieren.
Als Alternative gibt es auch noch PyChecker, hab ich selber allerdings noch nie getestet.
Antworten