Probleme beim Import von Funktiones

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.
Antworten
Downunder32ffm
User
Beiträge: 11
Registriert: Dienstag 19. September 2017, 22:35

Hallo Zusammen,

ich habe ein Problem beim Importieren von einer Funktion, wenn ich die def do über einen Import einfüge und das Programm ausführe Führt das Programm die print funktion aus aber hängt ein None in die nächste Zeile Warum?
Das passiert nicht wenn ich es die while True komplett eingebe.

Danke im Voraus

Code: Alles auswählen

import Zeitstempel as ms #Import ms in Zeitfunktion
import RPi.GPIO as GPIO
#import do as Text

#def do():
    #file = open("Abschluss.txt", "a")
    #Time = ("PTT pressed: "+ms.Zeit())
    #for i in Time:
       #file.write(str(i) +"\n")
    #file.close()
    #print(Time)

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
count = 0

while True :
   GPIO.wait_for_edge(11, GPIO.FALLING)
   count += 1

   #print(Text.do())     
   file = open("Abschluss5.txt", "a")
   Time = ("PTT pressed: "+ms.Zeit())
   for i in Time:
      file.write(str(i) +"\n")
   file.close()
   
   print(Time)
    
   
   ms.Zeit()
   
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Downunder32ffm: das hat nichts mit Importen zu tun. Du hast eine Funktion, die keinen Rückgabewert hat (None) und gibst den mit print aus.

In Python wird immer mit 4 Leerzeichen pro Ebene eingerückt. Dateien öffnet man am besten mit dem with-Statement. Wenn man über einen String iteriert, bekommt man die einzelnen Zeichen. Das sind schon Strings, darauf nochmal `str(i)` aufzurufen ist überflüssig. Willst Du wirklich jedes Zeichen einzeln in einer Zeile haben?
Downunder32ffm
User
Beiträge: 11
Registriert: Dienstag 19. September 2017, 22:35

Sirius3 hat geschrieben:@Downunder32ffm: das hat nichts mit Importen zu tun. Du hast eine Funktion, die keinen Rückgabewert hat (None) und gibst den mit print aus.

In Python wird immer mit 4 Leerzeichen pro Ebene eingerückt. Dateien öffnet man am besten mit dem with-Statement. Wenn man über einen String iteriert, bekommt man die einzelnen Zeichen. Das sind schon Strings, darauf nochmal `str(i)` aufzurufen ist überflüssig. Willst Du wirklich jedes Zeichen einzeln in einer Zeile haben?
@Sirius3:

Ich möchte das Drücken eines Taster mit protokollieren und dabei einen String und die Zeit mit ms in eine Datei schreiben. Gibt es schönere Möglichkeiten?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Downunder32ffm: wenn Du einen String an eine Datei anhängen möchtest und dabei jedes Zeichen in einer eigenen Zeile haben möchtest, nutzt Du am besten `join`:

Code: Alles auswählen

    with open("Abschluss5.txt", "a") as output:
        output.write('\n'.join("PTT pressed: {:%Y-%m-%d %H:%M:%S.%f}'.format(datetime.datetime.now())) + '\n')
Downunder32ffm
User
Beiträge: 11
Registriert: Dienstag 19. September 2017, 22:35

Sirius3 hat geschrieben:@Downunder32ffm: wenn Du einen String an eine Datei anhängen möchtest und dabei jedes Zeichen in einer eigenen Zeile haben möchtest, nutzt Du am besten `join`:

Code: Alles auswählen

    with open("Abschluss5.txt", "a") as output:
        output.write('\n'.join("PTT pressed: {:%Y-%m-%d %H:%M:%S.%f}'.format(datetime.datetime.now())) + '\n')

@Sirius3: Danke für deine Hilfe das eine Problem hat sich erledigt das unterschiedliche Zeiten zwischen dem abspeichern in eine Datei, aber leider hab ich immer noch keinen Ansatzpunkt wie ich es mit dem einfügen über eine Funktion realisiere das kein None aufgerufen wird!

Code: Alles auswählen

import RPi.GPIO as gpio
import time

def Zeit():                 #Definition es Zeitstempel
   now = time.time()        #Einfügen der allgemenínen Zeit    
   localtime = time.localtime(now) #Zeitdefinition der Zeitanzeige (gmtime = UTC; localtime = lokale eingestellte Uhrzeit) 
   msecs = "%03d" % int((now -int(now))*1000) #Definition der Millisecunde
   return time.strftime("%d-%m-%Y %H:%M:%S.", localtime) + msecs # Übergebener String bei Funktions übergabe

def do():
   with open("Abschluss.txt", "a") as output: 
      Time = ("PTT pressed: "+Zeit())
      output.write((Time) + "\n")
      print(Zeit())
   output.close()   

gpio.setmode(gpio.BOARD)
gpio.setup(11, gpio.IN, pull_up_down=gpio.PUD_UP)
count = 0

while True :
   gpio.wait_for_edge(11, gpio.FALLING)
   count += 1
   
   print(do())     
      
  

Und das Ergebnis:


>>> ================================ RESTART ================================
>>>
16-10-2017 14:27:41.583
None
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Downunder32ffm: Du willst nicht den Rückgabewert von `Zeit()` ausgeben. Laß das einfach sein! Du willst auch `Zeit()` nicht zweimal aufrufen, sondern das Ergebnis in einer Variable speichern. Eingerückt wird immer mit 4 Leerzeichen pro Ebene.

Code: Alles auswählen

import RPi.GPIO as gpio
from datetime import datetime as DateTime

def generate_timestr():
    return "{:%Y-%m-%d %H:%M:%S.%f}".format(DateTime.now())[:-3]

def do():
    current_time = generate_timestr()
    with open("Abschluss.txt", "a") as output: 
        output.write("PTT pressed: {}\n".format(current_time))
    print(current_time)

gpio.setmode(gpio.BOARD)
gpio.setup(11, gpio.IN, pull_up_down=gpio.PUD_UP)

while True:
    gpio.wait_for_edge(11, gpio.FALLING)
    do()
 
Downunder32ffm
User
Beiträge: 11
Registriert: Dienstag 19. September 2017, 22:35

Sirius3 hat geschrieben:@Downunder32ffm: Du willst nicht den Rückgabewert von `Zeit()` ausgeben. Laß das einfach sein! Du willst auch `Zeit()` nicht zweimal aufrufen, sondern das Ergebnis in einer Variable speichern. Eingerückt wird immer mit 4 Leerzeichen pro Ebene.

Code: Alles auswählen

import RPi.GPIO as gpio
from datetime import datetime as DateTime

def generate_timestr():
    return "{:%Y-%m-%d %H:%M:%S.%f}".format(DateTime.now())[:-3]

def do():
    current_time = generate_timestr()
    with open("Abschluss.txt", "a") as output: 
        output.write("PTT pressed: {}\n".format(current_time))
    print(current_time)

gpio.setmode(gpio.BOARD)
gpio.setup(11, gpio.IN, pull_up_down=gpio.PUD_UP)

while True:
    gpio.wait_for_edge(11, gpio.FALLING)
    do()
 
@ Sirius3: Danke. Ich bin absoluter Programmieranfänger und finde aber auch keine gutes Handbuch für Python. Es tut mir leid das ich dir anscheinend auf die Nerven gehe mit meiner Problematik, denoch finde ich das die schärfer deiner letzten hilfe nicht angemessen ist. kleines Feedback für dich, dein Code funktioniert zwar aber bei einem Tasterdruck werden mehrere Events gelistet!
Danke nochmals und sorry das ich Anfänger bin!
Antworten