ImportError: cannot import name datetime

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.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

ImportError: cannot import name datetime

Beitragvon Twilo » Freitag 6. Juni 2008, 14:35

Hallo,

ich erhalte folgende Fehlermeldung:
ImportError: cannot import name datetime
wenn ich versuche datetime wie folgt zu importieren

Code: Alles auswählen

from datetime import datetime, timedelta
danach erfolgt dann noch ein

Code: Alles auswählen

from core.datetime import DateTime

die Datei ./core/datetime.py ist eine Projektdatei.
wenn ich datetime mittels

Code: Alles auswählen

import datetime
importiere und dann datetime.datetime(...) aufrufe, erhalte ich folgende Fehlermeldung
dt = datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5])
AttributeError: 'module' object has no attribute 'datetime'


Wie kann ich die 2 Methoden des original Pythonmoduls oder das original Pythonmodul datetime importieren?

mfg
Twilo
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Freitag 6. Juni 2008, 14:54

`import datetime` und `from datetime import datetime` binden etwas an den selben Namen - da bleibt nur eins von übrig. Wenn du `datetime.datetime` (die Klasse) nutzen willst, dann musst du das zur Vermeidung von Nameclashes über den ausführlicheren Namen machen. Oder es unter einem anderen Namen importieren, was ich jedoch als keine Alternative ansehe.

`DateTime` dagegen ist wiederum ein anderer Name als `datetime` (da Python bei Namen case-sensitive ist) und kommt damit nicht in Konflikt. Der Klarheit solltest du aber überlegen, ob du nicht besser `core.DateTime` nutzt.

Bei deiner Anwendung solltest du weiterhin absolute Imports nutzen, also nicht `core.DateTime` sondern `yourapplication.core.DateTime`.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Beitragvon Twilo » Freitag 6. Juni 2008, 15:06

Hallo,

bei

Code: Alles auswählen

from datetime import datetime as datetime2, timedelta as timedelta2
erhalte ich folgende Fehlermeldung
ImportError: cannot import name datetime


bei

Code: Alles auswählen

import datetime as datetime2

kommt soetwas
dt = datetime2.datetime(t[0], t[1], t[2], t[3], t[4], t[5])
AttributeError: 'module' object has no attribute 'datetime'


das mein Modul (core.xyz) im selben Verzeichnis liegt wie datetime (core.datetime), importiert er wohl immer das falsche (core.datetime), statt das "normale" datetime


Y0Gi hat geschrieben:Bei deiner Anwendung solltest du weiterhin absolute Imports nutzen, also nicht `core.DateTime` sondern `yourapplication.core.DateTime`.

wie definiert sich "yourapplication"?
core.datetime kann ich nicht so ohne weiteres in core.DateTime umbennen

mfg
Twilo
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Freitag 6. Juni 2008, 15:23

Twilo hat geschrieben:das mein Modul (core.xyz) im selben Verzeichnis liegt wie datetime (core.datetime), importiert er wohl immer das falsche (core.datetime), statt das "normale" datetime

Ah, dann liegt es daran. Da hilft eigentlich nur, das Modul anders als eines in der Standardbibliothek zu benennen, z.B. `datetimeutils.py` oder so, oder aber den Suchpfad für Module (bzw. die Reihenfolge der Pfade darin) anzupassen - das ist aber nicht das wahre.


Twilo hat geschrieben:
Y0Gi hat geschrieben:Bei deiner Anwendung solltest du weiterhin absolute Imports nutzen, also nicht `core.DateTime` sondern `yourapplication.core.DateTime`.

wie definiert sich "yourapplication"?

Das ist einfach der Name deiner Applikation, zu der `core` gehört (von dem ich annehme, dass es ein Unterpaket ist). `yourapplication` wäre einfach der Name des obersten Verzeichnis, das eine `__init__.py` enthält. Ich nehme stark an, dass deine Applikation nicht `core` heißt?


Twilo hat geschrieben:core.datetime kann ich nicht so ohne weiteres in core.DateTime umbennen

Oh, hatte mich versehen. Ich dachte, es würde bereits `DateTime` heißen. Dann sprich es doch über den absoluten Namen an, wenn du mit mehreren `datetime`-Objekten (aus verschiedenen Quellen) im selben Modul arbeiten möchtest.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Beitragvon Twilo » Freitag 6. Juni 2008, 15:37

Hallo,

Y0Gi hat geschrieben:
Twilo hat geschrieben:das mein Modul (core.xyz) im selben Verzeichnis liegt wie datetime (core.datetime), importiert er wohl immer das falsche (core.datetime), statt das "normale" datetime

Ah, dann liegt es daran. Da hilft eigentlich nur, das Modul anders als eines in der Standardbibliothek zu benennen, z.B. `datetimeutils.py` oder so, oder aber den Suchpfad für Module (bzw. die Reihenfolge der Pfade darin) anzupassen - das ist aber nicht das wahre.

wie bereits beschrieben, kann ich das nicht so ohne weiteres ändern
ich müßte dafür alle python Dateien (das python Verzeichnis hat 82 MB) durchgehen und anschließend den Regressionstest ändern, etc.


Y0Gi hat geschrieben:
Twilo hat geschrieben:
Y0Gi hat geschrieben:Bei deiner Anwendung solltest du weiterhin absolute Imports nutzen, also nicht `core.DateTime` sondern `yourapplication.core.DateTime`.

wie definiert sich "yourapplication"?

Das ist einfach der Name deiner Applikation, zu der `core` gehört (von dem ich annehme, dass es ein Unterpaket ist). `yourapplication` wäre einfach der Name des obersten Verzeichnis, das eine `__init__.py` enthält. Ich nehme stark an, dass deine Applikation nicht `core` heißt?

es handelt sich um eine Webanwendung mit einen modefizierten HTTP-Server von Python. Der Pythonpath zeigt auf das python Verzeichnis

[code=]/usr/.../.../python
/usr/.../.../python/core
/usr/.../.../python/...
/usr/.../.../www
/usr/.../.../...[/code]

Y0Gi hat geschrieben:
Twilo hat geschrieben:core.datetime kann ich nicht so ohne weiteres in core.DateTime umbennen

Oh, hatte mich versehen. Ich dachte, es würde bereits `DateTime` heißen. Dann sprich es doch über den absoluten Namen an, wenn du mit mehreren `datetime`-Objekten (aus verschiedenen Quellen) im selben Modul arbeiten möchtest.

wie heißt beim oberen Beispiel "yourapplication"?

mfg
Twilo
lunar

Beitragvon lunar » Freitag 6. Juni 2008, 18:31

Twilo hat geschrieben:Hallo,

Y0Gi hat geschrieben:
Twilo hat geschrieben:das mein Modul (core.xyz) im selben Verzeichnis liegt wie datetime (core.datetime), importiert er wohl immer das falsche (core.datetime), statt das "normale" datetime

Ah, dann liegt es daran. Da hilft eigentlich nur, das Modul anders als eines in der Standardbibliothek zu benennen, z.B. `datetimeutils.py` oder so, oder aber den Suchpfad für Module (bzw. die Reihenfolge der Pfade darin) anzupassen - das ist aber nicht das wahre.

wie bereits beschrieben, kann ich das nicht so ohne weiteres ändern
ich müßte dafür alle python Dateien (das python Verzeichnis hat 82 MB) durchgehen und anschließend den Regressionstest ändern, etc.

Dann solltest du das vielleicht auch tun. Sorry, aber Namenskollisionen mit der Standardbibliothek sind immer schlecht, und wenn du an sys.path rumspielst, geht höchstwahrscheinlich mehr kaputt, als du reparierst.

Eine Alternative wäre "import core" und dann die Verwendung von "core.datetime", aber auch das halte ich für keine gute Idee.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Beitragvon Twilo » Sonntag 8. Juni 2008, 11:19

lunar hat geschrieben:
Twilo hat geschrieben:
Y0Gi hat geschrieben:
Twilo hat geschrieben:das mein Modul (core.xyz) im selben Verzeichnis liegt wie datetime (core.datetime), importiert er wohl immer das falsche (core.datetime), statt das "normale" datetime

Ah, dann liegt es daran. Da hilft eigentlich nur, das Modul anders als eines in der Standardbibliothek zu benennen, z.B. `datetimeutils.py` oder so, oder aber den Suchpfad für Module (bzw. die Reihenfolge der Pfade darin) anzupassen - das ist aber nicht das wahre.

wie bereits beschrieben, kann ich das nicht so ohne weiteres ändern
ich müßte dafür alle python Dateien (das python Verzeichnis hat 82 MB) durchgehen und anschließend den Regressionstest ändern, etc.

Dann solltest du das vielleicht auch tun. Sorry, aber Namenskollisionen mit der Standardbibliothek sind immer schlecht, und wenn du an sys.path rumspielst, geht höchstwahrscheinlich mehr kaputt, als du reparierst.

die Namenskollisionen hat ein anderer Entwickler eingeführt...
Ich kann das, wie schon erwähnt, nicht einfach so ändern.


lunar hat geschrieben:Eine Alternative wäre "import core" und dann die Verwendung von "core.datetime", aber auch das halte ich für keine gute Idee.

das bringt mir aber nichts, da ich das "normale" datetime dann immer noch nicht importieren kann.

mfg
Twilo
lunar

Beitragvon lunar » Sonntag 8. Juni 2008, 13:00

Code: Alles auswählen

from datetime import datetime
import core.datetime


Das sollte funktionieren.

Wenn dir ``core.datetime.DateTime`` (zurecht) nicht gefällt, dann – so hart es klingt – hast du eben Pech gehabt. Was erwartest du denn? Dass wir hier mit einem magischen Trick deine Namenskollisionen fixen können?

Ich kann dir nur empfehlen, die Namenskollision zu fixen. Das mag vielleicht nicht leicht sein, aber ist wird bestimmt auch nicht leichter, wenn du noch länger wartest. Zumal es bestimmt auch nicht das letzte Mal ist, dass dich diese Namenskollision plagt, wenn du sie jetzt nicht beseitigst.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Beitragvon Twilo » Sonntag 8. Juni 2008, 13:22

Hallo,

lunar hat geschrieben:

Code: Alles auswählen

from datetime import datetime
import core.datetime


Das sollte funktionieren.

das funktioniert leider nicht, wenn das Pxthonskript im Verzeichnis core ist.
Bei der ersten Zeile kommt dann die Fehlermeldung
ImportError: cannot import name datetime
, da die Datei core.datetime keine Methode/Klasse mit den Namen datetime besitzt.


lunar hat geschrieben:Wenn dir ``core.datetime.DateTime`` (zurecht) nicht gefällt, dann – so hart es klingt – hast du eben Pech gehabt. Was erwartest du denn? Dass wir hier mit einem magischen Trick deine Namenskollisionen fixen können?

Ich kann dir nur empfehlen, die Namenskollision zu fixen. Das mag vielleicht nicht leicht sein, aber ist wird bestimmt auch nicht leichter, wenn du noch länger wartest. Zumal es bestimmt auch nicht das letzte Mal ist, dass dich diese Namenskollision plagt, wenn du sie jetzt nicht beseitigst.

Das hat nichts mit "Nicht gefallen" zu tun.
  1. ein einfaches Search/Replace funktioniert nicht
  2. müssen dann mehrere Dokumentationen geändert
  3. die Testfälle, der Regressionstest und Tinderbox müssten angepasst werden
  4. etc. pp.

das ist nicht mal so schnell in einer Stunde erledigt

trotzdem danke für deine Hilfe

mfg
Twilo
lunar

Beitragvon lunar » Sonntag 8. Juni 2008, 13:52

Twilo hat geschrieben:Das hat nichts mit "Nicht gefallen" zu tun.
  1. ein einfaches Search/Replace funktioniert nicht
  2. müssen dann mehrere Dokumentationen geändert
  3. die Testfälle, der Regressionstest und Tinderbox müssten angepasst werden
  4. etc. pp.
das ist nicht mal so schnell in einer Stunde erledigt

Ja und? Warum erzählst du _mir_ das? Mir kann das egal sein, denn _ich_ muss dein Projekt weder entwickeln noch warten noch testen. _Du_ musst mit dieser Namenskollision leben, wie du damit umgehst, ist allein deine Sache. ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder