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
Syntaxcheck bei Python
Hallo
Ich habe da mal vor nem Jahr für Pyedit was gebastelt:
Gruß
Andyh
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")
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]
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys
if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
ich habe nur zwei Fenster die PythonShell mit inhalt:SchneiderWeisse hat geschrieben:Normalerweise sollte doch ein "Popup" erscheinen, das dir den Fehler anzeigt?
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.
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.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
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
- 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
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.
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
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.
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
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.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.
hth, Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
@ 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
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
Dann musst du diese Paramter halt manuell übergeben...Alana hat geschrieben:ich kann das Skript auch nicht so einfach in IDLE ausführen, da sonst Parameter fehlen.
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.