ModuleNotFoundError: No module named 'DateTimeRange'

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Badensia
User
Beiträge: 4
Registriert: Freitag 27. März 2020, 18:02

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 !
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann hast du garantiert zwei verschiedene Interpreter am Start. Wo laesst d udenn dein Skript laufen? In einer IDE?
Badensia
User
Beiträge: 4
Registriert: Freitag 27. März 2020, 18:02

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

Hallo Badensia,

lass das erste

Code: Alles auswählen

import DateTimeRange
einfach weg,. Du importierst ja dann nochmals mit

Code: Alles auswählen

from datetimerange import DateTimeRange
.
Alles was wir sind ist Sand im Wind Hoschi.
Badensia
User
Beiträge: 4
Registriert: Freitag 27. März 2020, 18:02

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:

Code: Alles auswählen

#! /usr/bin/python3
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 !
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Badensia
User
Beiträge: 4
Registriert: Freitag 27. März 2020, 18:02

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 :D

Danke Für Eure Hinweise, da mein Code aber geht lass ich ihn so - denn never touch a running system.
Problem solved.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten