Script läuft nicht flüssig via PUTTY, perfekt in IDLE

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich nutze pi-blaster und ein Python-Script um meinen LED-Strip anzusteuern.
    Wenn ich das Script in IDLE ausführe läuft alles wunderbar.
    Wenn ich das Script jedoch in der Konsole (egal ob lokal oder via PUTTY) starte, wird der LED-Strip nur sporadisch geschaltet (Ich meine immer wenn eine Konsolenausgabe erfolgt, bin mir da aber nicht ganz sicher)

    Das Script enthält im Wesentlichen Schleifen mit

    Code
    resultcode = os.system("echo '" + str(pin) + "=" + str(lum) + "' > /dev/pi-blaster")


    und

    Code
    time.sleep(irgendeinezeitangabe)


    War die ganze Arbeit jetzt umsonst? =(

    lg, couka

    Falls sich jemand das ganze Script antun möchte :^^:

    Einmal editiert, zuletzt von couka (13. März 2014 um 20:19)

  • Script läuft nicht flüssig via PUTTY, perfekt in IDLE? Schau mal ob du hier fündig wirst!

  • Tach auch,

    ich kann Dir leider bei Deinem script auch nicht helfen ( absoluter NoKnow in Python ), aber ich kann Dir aus leidvoller Erfahrung den Tipp geben, keine Umlaute in irgendwelchen Sourcen zu verwenden.
    Da hab' ich schon manch sonderbares Verhalten gehabt (das waren allerdings in etwa in der Zeit, in der gnucc noch mehr oder weniger in den Windeln lag).

    cheers,
    -ds-

  • Genau Linux mag keine Umlaute, auch nicht in Kommentaren, und wie man an deinem Code sieht scheinst du auch ein Problem mit dem Zeichensatz über PuTTY zu haben.
    Wie du das richtig einstellst wird dir hier erklärt: Wie stelle ich in Putty den richtigen Zeichensatz ein?


    Zu deinem Script:

    Aus eigener Erfahrung kann ich dir sagen dass Ausgaben in die Konsole ein python Script ausbremsen.. Wenn du also sicher gehen willst dann kommentier alle print Zeilen aus
    Zum debuggen in der Entwicklungsphase is das ja oke aber für die spätere Anwendung wirst du darauf vermutlich eh nicht mehr achten bzw wenn dir Geschwindigkeit wichtig(er) ist dann verzichte auf die prints und schreib das evtl. stattdessen in ein Logfile

    Desweiteren ist die zweite Zeile nicht korrekt:

    Code
    # coding: utf8


    ist ein einfaches Kommentar und wird von python nicht als das erkannt wofür das eigentlich stehen soll..

    Damit das funktioniert muss diese magic-line zum einen, entweder in der ersten oder in der zweiten Zeile stehen, und zum anderen muss die magic-line entweder exakt so wie folgt aussehen:

    Code
    # -*- coding: utf-8 -*-


    oder exakt so:

    Code
    # coding=utf-8


    hast du hiervon nur eine minimale Abweichung funktioniert das nicht mehr

    Wieso wird dir hier erklärt: http://legacy.python.org/dev/peps/pep-0263/
    Und Anwendungsbeispiele hier: http://wiki.python-forum.de/Von%20Umlauten…und%20Encodings


    Dann sind die Variablen die du ganz am Anfang des Scripts deklarierst (lumred usw) bereits global, die musst du nicht als solche extra festlegen. Nur in bestimmten Situationen innerhalb von definierten Anweisungen und dann auch nur wenn du in diesen def's Variablen setzt die dann ausserhalb der def's genutzt werden sollen.. Ein Beispiel dazu findest du hier: http://www.python-kurs.eu/global_lokal.php


    Und als allgemeiner Tip der nicht nur für Python gilt:
    Versucht immer so viel wie möglich nativ in der jeweiligen Programmiersprache zu machen und versucht möglichst wenig zu mischen

    Bedeutet:
    Versuche so viel wie möglich in Python umzusetzen und versuch so wenig wie möglich Konsolen Befehle auszuführen

    Dieses Mischen bremst ebenfalls aus.

    Also da fallen mir insbesondere deine os.system() auf über die du nach /dev/pi-blaster schreibst. Mach das lieber nativ in Python und verwende stattdessen open() usw, zum Beispiel:

    Code
    RED = str(pinred) + "=" + str(red)
    GREEN = str(pingreen) + "=" + str(green)
    BLUE = str(pinblue) + "=" + str(blue)
    f = open('/dev/pi-blaster','r+')
    f.write(str(RED))
    f.write(str(GREEN))
    f.write(str(BLUE))
    f.close()

    Und erwähnt werden muss auch das os.system() veraltet ist und bald nicht mehr unterstützt wird, benutz wenn dann bitte subprocess()
    http://docs.python.org/2/library/subprocess.html


    Das wärs was mir spontan aufgefallen ist, genauere Funktionsweisen hab ich jetzt nicht beachtet

  • Desweiteren ist die zweite Zeile nicht korrekt:

    Code
    # coding: utf8


    ist ein einfaches Kommentar und wird von python nicht als das erkannt wofür das eigentlich stehen soll..

    Damit das funktioniert muss diese magic-line zum einen, entweder in der ersten oder in der ersten und zweiten Zeile stehen, und zum anderen muss die magic-line entweder exakt so wie folgt aussehen:

    Code
    # -*- coding: utf-8 -*-


    oder exakt so:

    Code
    # coding=utf-8

    Falsch!
    # coding: utf-8 kann so ohne weiteres stehen gelassen werden, da der Interpreter in der ersten und in der zweiten Zeile nach der Kodierung sucht. Ich verwende der Einfachheit halber auch immer diese Schreibweise. Der Unterschied liegt ggf. bei den verschiedenen Texteditoren.


    Code
    a = 'Hallo Jürgen'
    print a
    
    
    >>test.py", line 1
    SyntaxError: Non-ASCII character '\xc3' in file test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
    Code
    # coding: utf-8
    a = 'Hallo Jürgen'
    print a
    >>Hallo Jürgen
  • Sodala... hab mich heute noch mal eine Zeit lang hingesetzt um den Fehler zu finden mit folgendem Ergebnis:

    IDLE sagt

    Code
    44/100 = 0.44

    Python selbst meint

    Code
    44/100 = 0


    Ich weiß nicht zu welchem Zweck diese Verhalten eingeführt wurde, aber es lässt sich mit

    Code
    float(44)/100


    umgehen.
    Eigentlich scheint 2. Variante auch logischer, da hab ich beim scripten nicht aufgepasst, aber wieso castet der IDLE Interpreter, wenn Python an sich es später nicht tut? :s
    Halte ich persönlich für einen ziemlich heftigen Bug.

    So oder so, Problem gelöst, gute Nacht zusammen :)

    lg, couka

  • Der Thread ist zwar schon älter, aber ich war schon einige Zeit nicht mehr im Forum und hab grad erst gesehen, dass da noch eine Frage kam. Also für die zukünftigen Besucher:

    Zitat

    Ich versteh nicht was das mit der Geschwindigkeit bzw dem flüssigen laufen des Scripts zu tun hat Icon_question2 Siehe Beitrag#1 und/oder Überschrift

    Es ist auch garkein Performance Problem. Die Sache ist die:
    Die Helligkeit ist ein Wert zwischen 0 (LED aus) und 1 (Volle Helligkeit)
    Wenn nun z.B. von ganz aus bis volle Helligkeit flüssig gefaded werden soll, geht der Helligkeitswert in 1000 0.001er Schritten hoch. Durch das angesprochene Integer/Float-Problem wird aber stattdessen 500mal 0%-Helligkeit und 500mal 100%-Helligkeit erzeugt. Und das sieht dann aus, als würde die Sache nicht flüssig laufen. In Wahrheit läufts wunderbar, nur halt falsch :lol:

    lg, couka

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!