Textdatei einlesen und in if verwenden

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.
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

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
Zuletzt geändert von Anonymous am Mittwoch 11. Februar 2015, 00:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@obstkuchen: Du vergleichst Äpfel mit Birnen, also konkreter eine Zeichenkette mit einer ganzen Zahl. Das kann niemals wahr ergeben.
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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... ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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. :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

Hallo,
ja ich kann das Licht | an | schalten, dann auf | 10% runterdimmen wieder hochdimmen | und wieder | ausschalten | daher kommen die 3 Dateien.
Mfg
Heiko
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

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?
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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/ :evil:
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Leiht mir euren Laien aus.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Den mit der Leier? :D
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

darktrym hat geschrieben:Leiht mir euren Laien aus.
Geh mal zur Ursula. Vielleicht kannst du ihn ja von der Leyen. 8)
obstkuchen
User
Beiträge: 13
Registriert: Dienstag 10. Februar 2015, 23:42

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:

Code: Alles auswählen

<?php
$licht = exec("python schalten.py $status");
<?
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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Antworten