Seite 1 von 2
Textdatei einlesen und in if verwenden
Verfasst: Dienstag 10. Februar 2015, 23:55
von obstkuchen
Hallo,
ich sitze jetzt seit 2 Tagen an folgenden, wahrscheinlich lächerlichen Problem.
Ich habe eine Hauseigende Internetseite worüber ich das Licht an/aus schalten kann (raspberry pi),
da ich das Licht auch dimmen möchte, habe ich ein Python Skript welches ein Software PWM generiert.
Um das Skript zu beenden dachte ich mir, ich schreibe über die Internet Seite eine 1 in eine Textdatei welche in meinem Skript aufgerufen wird, um die schleife zu beenden.
Folgendes Problem habe ich jetzt:
Code: Alles auswählen
#!/usr/bin/env python
f = open("12.txt")
zeilen = f.read()
#print zeilen
if zeilen == 1:
print "if ok"
f.close()
if wird aber nicht als wahr ausgegeben.
Also „if ok“ wird mir nicht angezeigt.
Selbst wenn ich im gleichen Skript in die Textdatei eine 1 schreibe geht es nicht, ich werde hier noch blöde.
Was mache ich falsch?
Mfg
Heiko
Re: Textdatei einlesen und in if verwenden
Verfasst: Mittwoch 11. Februar 2015, 00:20
von BlackJack
@obstkuchen: Du vergleichst Äpfel mit Birnen, also konkreter eine Zeichenkette mit einer ganzen Zahl. Das kann niemals wahr ergeben.
Re: Textdatei einlesen und in if verwenden
Verfasst: Mittwoch 11. Februar 2015, 00:24
von obstkuchen
aaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhh
ja jetzt ist klar.
Danke, man muss nur wissen wonach man suchen muss.
was zwei " so ausmachen können
Code: Alles auswählen
#!/usr/bin/env python
f = open("12.txt")
zeilen = f.read()
#print zeilen
if zeilen == "1":
print "if ok"
f.close()
geht
mfg
Heiko
Re: Textdatei einlesen und in if verwenden
Verfasst: Mittwoch 11. Februar 2015, 00:56
von snafu
BlackJack hat geschrieben:@obstkuchen: Du vergleichst Äpfel mit Birnen, also konkreter eine Zeichenkette mit einer ganzen Zahl. Das kann niemals wahr ergeben.
Zumindest in Python nicht. In einer anderen Sprache mit P am Anfang sieht das schon anders aus...

Re: Textdatei einlesen und in if verwenden
Verfasst: Mittwoch 11. Februar 2015, 09:51
von Hyperion
Du solltest Dateien immer mittels ``with`` öffnen (denn das schließt diese *immer* automatisch, auch beim Auftreten von Exceptions!):
Code: Alles auswählen
with open("12.txt") as f:
zeilen = f.read()
#print zeilen
if zeilen == "1":
print "if ok"
Der Name ``zeilen`` ist schlecht gewählt! In Wirklichkeit stehen da ja gar keine (Text-)Zeilen drin, sondern nur eine "1"! Da Du dort letztlich einen Befehl ablegst, könntest Du das z.B. ``command`` nennen! Da Du den Inhalt aber nur für die Auswertung der ``if``-Bedingung benötigst, brauchst Du den Inhalt auch gar nicht an einen Namen binden und kannst das direkt so schreiben:
Code: Alles auswählen
with open("12.txt") as f:
if f.read() == "1":
# whatever
Re: Textdatei einlesen und in if verwenden
Verfasst: Mittwoch 11. Februar 2015, 15:27
von Kebap
obstkuchen hat geschrieben:
Um das Skript zu beenden dachte ich mir, ich schreibe über die Internet Seite eine 1 in eine Textdatei welche in meinem Skript aufgerufen wird, um die schleife zu beenden.
Klingt abenteuerlich, wie darf ich mir das vorstellen? Glaube, dass das nicht üblich ist. Aber schön, wenns erstmal läuft.

Re: Textdatei einlesen und in if verwenden
Verfasst: Mittwoch 11. Februar 2015, 23:20
von obstkuchen
Hallo,
ja, das man das nicht so macht, habe ich mir schon gedacht

Ich habe eine PHP Seite womit ich ein „an.py“ ausführe:
Code: Alles auswählen
$value = implode("",file("12.txt"));
if($value == 0)
{
exec ("sudo /var/www/an.py");
$handle = fopen ( "12.txt", "w" );
fwrite ( $handle, 1 );
fclose ( $handle );
}
ACHTUNG alle die Ahnung von python haben bitte wegschauen
An.py:
Code: Alles auswählen
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
gpio = 12
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(gpio, GPIO.OUT)
p = GPIO.PWM(gpio, 50)
p.start(0)
try:
while 1:
for dc in range(0, 100, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
break
except KeyboardInterrupt:
pass
p.stop()
GPIO.cleanup()
Somit wird das Licht langsam angedimmt.
Um Fernsehen zu können kann ich das Licht runterdimmen mit.
ACHTUNG jetzt wieder wegsehen
Dimmen.py:
Code: Alles auswählen
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
gpio = 12
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(gpio, GPIO.OUT)
p = GPIO.PWM(gpio, 50)
p.start(0)
for dc in range(100, 40, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
f = open("12.txt")
zeilen = f.read()
f.close()
while zeilen.rstrip() == "1":
time.sleep(2)
f = open("12.txt")
zeilen = f.read()
f.close()
Wenn ich fertig „Ferngesehen“ habe, schreibe ich mittels PHP eine 1 in eine Textdatei (12.txt),
und alles wird gut.
Da der Pi nur wenige Aufgaben zu erledigen hat ist es mir vollkommen egal das er die ganze Zeit in einer Schleife verweilt.
Mfg
Heiko
Re: Textdatei einlesen und in if verwenden
Verfasst: Donnerstag 12. Februar 2015, 08:07
von Sirius3
@obstkuchen: Du hast ein PHP-Skript, das ein an.py und ein aus.py startet. Was hat es da für einen Sinn, dass sich aus.py nicht sofort beendet? Eine while-Schleife, die immer wahr ist, aber nach dem ersten Durchgang immer beendet wird, ist da genauso sinnvoll.
Re: Textdatei einlesen und in if verwenden
Verfasst: Samstag 14. Februar 2015, 18:27
von obstkuchen
Hallo,
ja ich kann das Licht | an | schalten, dann auf | 10% runterdimmen wieder hochdimmen | und wieder | ausschalten | daher kommen die 3 Dateien.
Mfg
Heiko
Re: Textdatei einlesen und in if verwenden
Verfasst: Samstag 14. Februar 2015, 19:27
von cofi
Bleiben wir mal bei der Datei-basierten Steuerung. Warum schreibst du denn nicht gleich das Kommando in eine Datei, statt nur den Parameter in drei verschiedene?
Und dann koennen wir uns das ganze Geraffel auch gleich sparen, wenn du in deinem Python-Programm du Aufruf-Argumente verarbeiten und durch das PHP Skript richtig aufrufen wuerdest.
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 14:12
von obstkuchen
Hallo,
ja das kann man mit Sicherheit so machen, wenn man davon Ahnung hat.
Aber warum schwer, wenn es auch einfach geht.
Wie schon gesagt „ja, das man das nicht so macht, habe ich mir schon gedacht “
Aber es geht, was will ich als leihe mehr?
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 14:16
von Kebap
obstkuchen hat geschrieben:
Aber es geht, was will ich als leihe mehr?
Manchmal kommt man nach einiger Zeit zurück zu dem Code, den man damals so "schnell und dreckig" verfasst hat, und versteht gar nix mehr. Dann werden nachträgliche Änderungen schwer. (a la "Wieso steht da eine 1 in der Datei und was soll die bedeuten?") Es wird einfach schnell unübersichtlich. Deshalb gehen die meisten Leute nach einigen Erfahrungen dazu über, lieber etwas sauberer zu programmieren, damit man bei späteren Anpassungen (die fast immer kommen werden) ein leichteres Leben hat.
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 15:59
von obstkuchen
Hallo,
ja das ist so meistens vollkommen richtig, aber meine Erfahrung hat gezeigt, dass wenn ICH einmal selber darauf gekommen bin, komme ICH auch ein 2. mal drauf.
Wenn ich also mit eurer Hilfe den Code so abändere, dass dieser vollkommen richtig, für mich aber unverständlich ist, habe ich später keinen blassen Schimmer warum dieser so Läuft.
Ich benutze auch lieber ein Goto in einem Code, als eine Schleife zu benutzen.
Schleifen bekomme ich zwar mittlerweile zum Laufen, aber Goto ist für mich verständlicher.
Mfg
Heiko
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 16:36
von Hyperion
@obstkuchen: Du kannst es natürlich halten wie Du willst, aber wenn Du in einem Forum fragst, in dem sich viele erfahrene Entwickler herumtreiben, dann musst Du auch damit leben, dass diese Dich auf
etablierte Konzepte,
Konventionen und
Methodiken hinweisen

Diese musst Du nicht befolgen - aber zum einen sollte man das, es sei denn, man ist ein Genie und kann andere zu einem Paradigmenwechsel überzeugen, zum anderen wirst Du auf Dauer wenig Hilfe bekommen, wenn Du die Ratschläge in den Wind schlägst.
@Problem: Du solltest imho cofis Ratschlag weiterverfolgen. Du kennst doch bestimmt Tools, die derart arbeiten, dass man ihnen ein Kommando mitgibt und sie dieses entsprechend ausführen. Spontan fallen mir da Dinge wie "git", "svn", "pip" usw. ein, oder auch Paketmanagementtools wie z.B. "pacman" von Arch Linux.
Nehmen wir mal "git"... dort kannst Du Dinge tun, wie "git add ..." oder "git commit ..." oder "git push ...". Nach dem Programmnamen kommt direkt ein Befehl.
Genauso könntest Du doch Dein Python-Programm aufbauen! Nehmen wir an, es heißt "licht.py", dann könntest Du folgendes CLI-API bauen:
- "licht an"
- "licht aus"
- "licht runter" (fürs Dimmen)
- "licht rauf" (fürs Dimmen)
Dein Programm müsste also die übergeben Kommandozeilenattribute parsen und je nach Befehl, eine andere Funktion aufrufen. Für das Parsen gibt es schon das eingebaute Modul ``
argparse``. Dort kannst Du Dir mal den Abschnitt zu
choices angucken, denn imho brauchst Du genau das.
Damit hast Du mit vier Zeilen das Kommando geparst und kannst danach mit einfachen Mitteln wie ``if... elif...`` auf die richtige Funktionalität verzweigen. (Fortgeschrittene nutzen dafür Datenstrukturen, wie z.B. ein Dictionary mit dem Befehl als Schlüssel und dem Funktionsnamen als Wert)
Das ist wirklich nicht so schwierig. Du musst nur Deine bisherigen Programme inhatlich in Funktionen verpacken, damit Du sie in den ``if``-Rümpfen aufrufen kannst. Das sollte aber auch einfach machbar sein.
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 16:43
von snafu
obstkuchen hat geschrieben:Ich benutze auch lieber ein Goto in einem Code, als eine Schleife zu benutzen.
Schleifen bekomme ich zwar mittlerweile zum Laufen, aber Goto ist für mich verständlicher.
http://xkcd.com/292/ 
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 16:48
von darktrym
Leiht mir euren Laien aus.
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 16:59
von EyDu
Den mit der Leier?

Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 17:01
von snafu
darktrym hat geschrieben:Leiht mir euren Laien aus.
Geh mal zur Ursula. Vielleicht kannst du ihn ja von der Leyen.

Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 17:34
von obstkuchen
Hallo,
@all
ich bin natürlich dankbar für jede Hilfe die ich bekommen kann.
Bin natürlich auch dankbar, dass es Experten gibt, die sich überhaupt mit Anfängerfragen rumschlagen, obwohl wahrscheinlich jedes Problem schon x Mal über die Suche zu finden ist.
@cofi
@Hyperion
Meintet ihr zufällig das ?
Gpio.php:
Doch wie müsste dann das Python Skript aussehen, das es die variable ($status) auch annimmt?
Schalten.py:
Code: Alles auswählen
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
gpio = 10
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(gpio, GPIO.OUT)
p = GPIO.PWM(gpio, 50)
p.start(0)
if $status == “an” :
for dc in range(0, 100, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
if $status == „aus“ :
for dc in range(100, 0, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
if $status == “kino” :
for dc in range(100, 20, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
while $status ==”wieder_an”
for dc in range(20, 100, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
Wenn das allerdings nicht euer Lösungsvorschlag war, dann habe ich euern Post nicht verstanden.
mfg
Heiko
Re: Textdatei einlesen und in if verwenden
Verfasst: Dienstag 17. Februar 2015, 17:39
von EyDu
Wenn du den Parameter per Hand verarbeiten möchtest, dann musst du das sys-Modul importieren. Mit ``sys.argv`` kannst du dann auf die Liste mit Argumenten zugreifen. Das argparse Module wurde weiter oben ja schon erwähnt