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.
Grundsätzlich geht das so. Ob das ultimativ das richtige Vorgehen ist, hängt aber natürlich an der zu lösenden Aufgabe. Und ich würde ggf den zeitvergleich In die while Bedingung packen, und die Änderung des Zustands dann nach der schleife. Dann macht die nur ein Ding.
phase = 1
dauer = 1
while True:
sek = 1
print("Testprogramm")
start = time.time()
dauer=dauer*60
ende = dauer+start
while phase == 1:
print(sek)
print("Sekunden")
aktuell = time.time()
if (aktuell>ende):
print("Ende")
phase = 2
sek = sek+1
time.sleep(1)
Nach meinem Verständnis müsste er einfach nur 60 Sekunden laufen und dabei die Sekunden zählen. Dann Ende schreiben.
Leider kommt aber folgende Fehlermeldung:
Testprogramm
Traceback (most recent call last):
File"test.py", line 123, in <module>
print(sek)
.
.
.
TypeError: unsupported oerand type(s) for +=: 'int' and 'str
Da im gesamten Programm kein += vorkommt und es auch keine Zeile 123 gibt, passt der Code nicht zum Fehler und ist auch nicht vollständig.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs, Die Klammern beim if sind überflüssig.
Statt einer Variable `phase` würde man eine Endlosschleife mit break verlassen. Oder noch besser, man hat ja eigentlich einen Zähler sek, oder eigentlich braucht man den gar nicht.
Bei der Genauigkeit würde auch ein einfaches:
ja, in der Ursprungsdatei waren noch eine Unmenge an Funktionen drin, die aber für den Test gar nicht benötigt waren. Hatte da Quick und Dirty einfach eine vorhandene Datei genommen, die ich irgendwann mal angefangen habe.
Habe es nun nochmal komplett neu geschrieben und hier der Inhalt der gesamten test.py:
from __future__ import print_function
from termcolor import cprint as print
import RPi.GPIO as GPIO
import spidev
import time
import random
import sys
import os
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
phase = 1
dauer = 1
while True:
sek=1
print("Dieses Testprogramm dient der Visualisierung einer Zeitschleife.")
start = time.time()
dauer = dauer*60
ende = dauer+start
while phase == 1:
print(sek)
print ("Sekunden")
aktuell = time.time()
if (aktuell > ende):
print("Ende")
phase = 4
sek = sek+1
time.sleep(1)
Es folgt noch immer die gleiche Fehlermeldung:
Dieses Testprogramm dient der Visualisierung einer Zeitschleife.
Traceback (most recent call last):
File "test.py", line 23, in <module>
print(sek)
File "usr/local/lib/python2.7/dist-packages/termcolor.py", line 124, in cprint
orint((colored(text, color, on_color, attrs)), **kwargs)
File "/usr/local/lib/python2.7/dist-packages/termcolor.py", line 114, in colored
text += RESET
TpeError: unsupported operand type(s) for +=: 'int' and 'str'
@Netdeus: Offensichtlich mag `termcolor.cprint()` keine Zahl als Argument. Wenn das komplett neu geschrieben ist, warum enthält das dann so viele unnötige Importe die entweder nicht verwendet werden, oder gar nichts mit dem Problem zu tun haben das hier behandelt wird?
Warum noch Python 2? Anscheinend auch noch ein selbst kompiliertes‽ Python 2 ist tot.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Es läuft auf einem Raspberry und den habe ich, als ich mit der Aufgabe angefangen habe, aufgespielt und seitdem auch nicht mehr verändert. Bin auch froh, wenn das Programm dann mal irgendwann läuft und ich es nicht mehr anfassen muss.
Die Importe habe ich drin gelassen, da ich diese alle für das "Endprodukt" brauche...
Hatte deswegen auch schon mal versucht jemanden zu finden, der das ganze natürlich gegen Gebühr macht, aber leider nur Angebote gefunden, die weiter über 5k lagen und bei aller Liebe, das war mir dann doch ein wenig viel. Wahrscheinlich hat das ein geübter Programmierer nämlich innerhalb einer Stunde geschrieben.
ohne den Import funktioniert es - dann schaue ich mal, wie ich das machen muss, damit es auch mit import geht.
Python 3 habe ich drauf - dort fehlt nur die Erweiterung, damit ich Schrift farbig ausgeben kann.
Und Software braucht keine Wartung, wenn sich die Rahmenbedingungen nicht ändern..und warum sollten sie das? Habe im Betrieb heute noch Software unter DOS laufen und das bereits seit über 20 Jahren...ohne jemals etwas verändert zu haben.
Software hat kein Haltbarkeitsdatum, lediglich die Hardware.
Bist du dem Hinweis von __blackjack__ mal nachgegangen? Was passiert, wenn du statt `print(sek)` probierst einen String zu nehmen: `print(str(sek))`? Benutzt du das überhaupt wirklich in deinem Code bzw. willst du das benutzen? Dann könntest du auch auf das neuere und gepflegtere colorama zurückgreifen.
@Netdeus: Das `termcolor` gibt es auch für Python 3. Und auch genug Alternativen falls es das nicht gäbe.
Eine Rahmenbedingung müsste dann ja aber sein, dass es fehlerfreie Software gibt.
Die Rahmenbedingungen ändern sich weil sich alles drumherum weiterentwickelt. Zum Beispiel das Betriebssystem. Ist bei DOS nicht der Fall, dafür muss man aber immer mehr machen um DOS überhaupt noch zum laufen zu bekommen. Erst ging das unter Windows noch, weil Microsoft/Windows da noch unterstützt hat, mittlerweile gibt es immer mehr Szenarien wo man mit virtueller Maschine oder Emulatoren arbeiten muss, um DOS-Software auf einem modernen System noch laufen lassen zu können.
Und beim Raspi ändert sich das Betriebssystem. Und mit dem Betriebssystem die Verfügbarkeit von Python 2, denn das fliegt aus den Linux-Distributionen raus. Es gibt mittlerweile von den Python-Entwicklern selbst nicht mal mehr Sicherheitsupdates und es sieht nicht so aus als wenn es einen grossen Player gäbe, also beispielsweise eine Linux-Distribution, die das übernehmen würde. Ist ja auch lange genug bekannt das man auf Python 3 umsteigen sollte. Die Entscheidung, dass es kein Python 2.8 geben wird, und das man *wirklich* auf 3.x umsteigen sollte, fiel vor 9 Jahren.
Wenn sich `termcolor.cprint()` nicht wie das eingebaute `print()` verhält, sollte man das vielleicht nicht unter dem gleichen Namen importieren. Das ist verwirrend. Falls das kein Programm werden soll mit dem der Benutzer auf der Konsole interagiert, würde man vielleicht auch besser gar kein `print()` verwenden, sondern eine Logging-Bibliothek. Da gibt es auch welche die auf der Konsole farbig protokollieren können. `loguru` beispielsweise.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
habe es inzwischen zum laufen bekommen - den Import von termcolor habe ich weg genommen. Ich werde dann im "endgültigen Script" einfach nach einer Alternative suchen müssen.
Ob das Programm dann am Ende über Python 2 oder 3 läuft ist mir eigentlich egal. Das Betriebssystem vom Pi wird nicht geupdated, wie ich bereits sagte ist es eine Lösung und diese bleibt bis sie nicht mehr benötigt wird und kommt danach in den Müll. Ich denke das wird noch 5-10 Jahre dauern, aber bis dahin hält der auf jeden Fall durch (zur Not liegt ein Ersatzgerät bereit...)
Und um auch diese Diskussion abzuschließen - um auf heutiger Hardware noch DOS zum laufen zu bringen kostet es in der Tat viel Mühe. Aber wie ich ja bereits sagte ist nicht die Software, sondern die Hardware das Problem. Neuere Hardware erfordert auch neuere Betriebssysteme. In meinem Beispiel handelt es sich aber um Insellösungen, die wie gesagt seit 20 Jahren laufen und wahrscheinlich noch mindestens weitere 10 Jahre. Danach sollten die Systeme wohl abgeschaltet werden. Bis dahin liegt noch genug Hardware als Ersatz rum und kann zur Not verwendet werden. Man würde sich übrigens wundern, wie viele Firmen in der Industrialisierung jetzt so langsam ihre Maschinen erst auf Windows 7 umrüsten, weil es für Windows 10 noch keine Lösung gibt.
Mein Problem an dieser Stelle ist eher, dass ich die Sprache (Python) einigermaßen lesen, aber eben nicht schreiben kann. Ich verstehe also, was ihr meint, kann aber keine Alternative schreiben. Das Script besteht zum größten Teil aus zusammengesuchten Einzelstücken, deren Hintergrund ich eben nur bis zu einem Teil nachvollziehen kann. Ich habe damals eine Lösung für farbige Schrift gesucht und Termcolor gefunden. Eine Anleitung, wie man es einbindet - und dort war das mit cprint as print angegeben. Habe ich so gemacht und hat funktioniert. Dann habe ich das eben auch nie wieder hinterfragt. Mein Ziel war es nie die Sprache Python zu lernen (ich werde sie nur für dieses eine Script benötigen) sondern einen Abschluss zu bekommen.
Ich danke euch aber allen für die wirklich gute Hilfe!!