Seite 1 von 1
ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Freitag 27. März 2020, 18:10
von Badensia
Hallo Leute !
Ich habe mittels einem raspi 4/4gb und dem DHT22 Sensor und eine RF Modul einn script gebaut mit welchem ich ein Terrarium steuern kann, auf Basis der Messwerte.
Nun möchte ich das noch timen, sodass Nachts alles abgeschaltet wird.
Dazu verwendet man wohl das python modul DateTimeRange, welches ich mittels pip erfolgreich installiert habe.
pip freeze zeigt es mir auch an:
Code: Alles auswählen
pi@raspberrypi:~ $ pip freeze
...
[b]DateTime==4.3
DateTimeRange==0.6.1[/b]
...
Wenn ich allerdings einen python script ausführen möchte welcher auf dieses Modul zugreift erhalte ich folgenden Fehler:
ModuleNotFoundError: No Module named 'DateTimeRange'
Hat jemand eine Idee woran das liegen kann ?
Ich nutze Raspbian 10 Buster
und
Python 2.7.16
Danke und beste Grüße !
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Freitag 27. März 2020, 18:19
von __deets__
Dann hast du garantiert zwei verschiedene Interpreter am Start. Wo laesst d udenn dein Skript laufen? In einer IDE?
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Freitag 27. März 2020, 19:09
von Badensia
Entweder IDE (Thonny, wenn ich da richtig liege)
oder Shell direkt
pi@raspberrypi:~ $ ./timescript.py
Traceback (most recent call last):
File "./timescript.py", line 5, in <module>
import DateTimeRange
ImportError: No module named DateTimeRange
pi@raspberrypi:~ $
mein code:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import DateTimeRange
import datetime
from datetimerange import DateTimeRange
# print current date and time
print(time.strftime("%H:%M:%S"))
Ist DateTimeRange überhaupt richtig für die Funktion welche ich brauche ?
Also "check current time" if "current time is in range 23:00 - 06:00" then "aus"
Ich möchte diese Funktion in meinen Hauptscript implementieren, Selbiger läuft perfekt eben ohne das Nachtfenster. Der Hauptscript läuft als CronJob zu jeder vollen Minute.
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Freitag 27. März 2020, 19:45
von noisefloor
Hallo,
das Import-Statement muss `import datetimerange` (alles klein) heißen. So sagt es jedenfalls die
Doku...
Du weißt, dass Python 2 seit dem 1.1.2020 EOL ist und keinen Support mehr durch die Python-Entwickler hat? Sprich, du möchtest dein Skript so wie so auf Python 3 aktualisieren.
Gruß, noisefloor
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Freitag 27. März 2020, 20:26
von hyle
Hallo Badensia,
lass das erste
einfach weg,. Du importierst ja dann nochmals mit
.
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Samstag 28. März 2020, 06:39
von Badensia
Hallo !
Ich habe jetzt auch noch python Version: 3.7.3-1 installiert, nach dieser Anleitung:
https://tech.serhatteker.com/post/2019- ... -ubuntu18/
@noisefloor: Thx for the hint !
Anschliessend mit pip3 noch datetimerange installiert.
pip3 freeze gibt folgendes zurück:
DateTimeRange==0.6.1
im Script selbst habe ich im Header folgendes eingetragen:
Ich erhalte nun keinen Fehler mehr, allerdings gibt der script nichts aus.
Hier mein aktueller Test-Script:
Code: Alles auswählen
from datetimerange import DateTimeRange
time_range = DateTimeRange("2015-03-22T10:00:00+0900", "2015-03-22T10:10:00+0900")
str(time_range)
Ich könnte das Ganze umgehen wenn ich anstatt datetimerange die Standart time funktion nehme:
Code: Alles auswählen
t = time.localtime()
current_time = time.strftime("%H:%M:%S", t)
print("Uhrzeit: ",current_time)
#Zeitfenster AUS
abend = "19:00:00"
morgen = "06:00:00"
print('Temperatur: {0:0.1f}°C'.format(temperature, humidity))
#Wenn aktuelle Zeit gleich abend oder größer, dann
if (current_time == abend) or (current_time >= abend):
print ("ABEND")
print ("TEMP AUS")
cmd = '/home/pi/raspberry-remote/send 11111 1 0'
os.system(cmd)
print('HUMI AUS')
cmd = '/home/pi/raspberry-remote/send 11111 2 0'
os.system(cmd)
...oder gibt es da probleme ?
Danke für Eure Hilfe !
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Samstag 28. März 2020, 09:22
von __blackjack__
@Badensia: Natürlich gibt das Testskript nichts aus. Warum hättest Du erwartet es würde etwas ausgeben und was denkst Du was die letzte Zeile macht?
Beim zweiten Code wird `os.system()` verwendet: Tu das nicht. Um externe Programme auszuführen ist das `subprocess`-Modul da. Und da das ziemlich gleich aussieht was da jeweils gemacht wird, sollte man das in eine Funktion heraus ziehen.
Die Klammern in der ``if``-Bedingung sind alle überflüssig, und der erste Operand von ``or`` ist insgesamt überflüssig, denn wie müsste eine `current_time` aussehen die gleich `abend` aber nicht grösser oder gleich `abend` ist?
Insgesamt ist das halt unschön Zeiten als Zeichenketten zu vergleichen, insbesondere wenn man die Zeiten dafür erst in Zeichenketten umwandeln muss. Für so etwas gibt es eigene Datentypen im `datetime`-Modul.
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Samstag 28. März 2020, 09:36
von __blackjack__
Weitere Anmerkungen: `t` ist wie die meisten einbuchstabigen Namen kein guter Name. Namen sollen dem Leser vermitteln was ein Wert bedeutet, nicht zum rätselraten zwingen.
`morgen` wird definiert, aber nicht verwendet.
Im zweiten `print()` gibt es in der Zeichenkette *einen* Platzhalter, `format()` werden aber *zwei* Werte übergeben.
Kommentare sollen dem Leser einen Mehrwert über den Code hinaus liefern. Kommetare die einfach nur beschreiben was da schon laut und deutlich als Code steht, tun das nicht.
Code: Alles auswählen
#!/usr/bin/env python3
import subprocess
from datetime import datetime as DateTime, time as Time
TEMPERATURE_SENSOR_NUMBER = 1
HUMIDITY_SENSOR_NUMBER = 2
def remote_send(sensor_number, value):
subprocess.run(
[
"/home/pi/raspberry-remote/send",
"11111",
str(sensor_number),
str(value),
],
check=True,
)
def main():
...
current_time = DateTime.now().time()
print("Uhrzeit:", current_time)
abend = Time(19)
print(f"Temperatur: {temperature:0.1f}°C")
if current_time >= abend:
print("ABEND")
print("TEMPERATURE AUS")
remote_send(TEMPERATURE_SENSOR_NUMBER, 0)
print("HUMIDITY AUS")
remote_send(HUMIDITY_SENSOR_NUMBER, 0)
if __name__ == "__main__":
main()
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Samstag 28. März 2020, 11:33
von Sirius3
Wenn du das eh schon über einen cronjob startest, warum dann nicht gleich in der cron-Definition das richtige Programm zur richtigen Zeit ausführen?
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Samstag 28. März 2020, 13:58
von Badensia
Was ich erwartet habe ? Das ist ein Beispiel aus einer Webseite zu datetimerange, ich glaube sogar die offizielle Doku.
Aber Wurst. datetimerange brauche ich wohl nicht, auch wenn niemand diese Frage beantwortet hat.
Ich will keinen Code Design Preis gewinnen, sondern das es funktioniert. Die Kommentare sind übrigens für mich und nicht für Euch, die ihr ja sowieso den Code versteht.
Das mit dem Subprocess hatte ich schon, hat nicht funktioniert . ergo zurück zu dieser Funktion. Es tut ja auch, also was solls.
Das ist zudem nur der halbe Code, da hier auch Humidity berücksichtigt wird. 'morgen' steht weiter unten usw.
Mir ging es nur um diesen Umstand:
"...oder gibt es da probleme ? " In Bezug darauf es über current_time zu machen, da datetimerange nicht geht.
Sprich, eben darüber Zeitfenster zu erstellen. Dewegen habe ich nicht den ganzen Code reinkopiert, zumal ich - warum auch immer - kein Copy & Paste per VNC vom Pi zum PC hinkriege.
Anders herum gehts. Egal.
Ganz nebenbei ist das mal allererster Versuch Python zu coden und der Code funktioniert ohne Probleme, ich wollte Ihn nur durch eine nächtliche Auszeit erweitern.
Ich habe zumindest verstanden das ich, obwohl mein Code problemlos läuft, scheinbar gar nix verstanden habe
Danke Für Eure Hinweise, da mein Code aber geht lass ich ihn so - denn never touch a running system.
Problem solved.
Re: ModuleNotFoundError: No module named 'DateTimeRange'
Verfasst: Samstag 28. März 2020, 21:17
von /me
Badensia hat geschrieben: Samstag 28. März 2020, 13:58
Ich will keinen Code Design Preis gewinnen, sondern das es funktioniert.
Und sobald man dann etwas ändern möchte geht es schief, wie du sehr schön demonstriert hast. Danke dafür.