Wie erstelle ich ein eigenes modul?

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.
Thanatos83
User
Beiträge: 12
Registriert: Dienstag 9. Mai 2006, 18:56

Hallo Leute,

ich hab jetzt schon ziemlich lange suchmaschinen und die suchfunktion konsultiert, bin aber noch zu keinem vernünftigen ergebnis gekommen.

ich hab zwei dateien im gleichen Ordner:

tesselierung.py und modul.py (in dem eine Funktion namens "meinmodul" ist)

ich rufe tesselierung.py auf, in dem steht:

import blender
import os
import modul

from modul import *

Warum erhalte ich die Meldung: "No module named modul" ???

ich hab keine ahnung, wo der Fehler ist.

Danke im Vorraus
Cu Thanatos83

Rettet die Wälder, esst mehr Biber!!!
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Code: Alles auswählen

import blender
import os
import modul

from modul import * 
du importierst das modul 2 mal auf 2 verschiedene arten :roll:

entweder

Code: Alles auswählen

import modul
oder...

Code: Alles auswählen

from modul import *
Aber wieso es nicht geht...

Evtl wegen de Pfad angaben in ewlchen python suchen muss. Nim doch mal ein anderen Namen...
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Ich finde "modul" einen schlechten Namen. Weiss nicht ob es in Python selber irgend ein Statement oder sowas gibt das genau gleich heisst. Meine Empfehlung:

Gibt dem Modul einen Sinnvollen Namen und mach dann das, was DatenMetzgerX gesagt hast. Entweder auf die eine oder andere Weise importieren...

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich habe auch schonmal was fuer Blender mit Python programmiert, aber ich kann mich gerade nicht mehr erinnern, ob man da etwas Spezielles beachten muss, oder ob ich damals ueberhaupt ein eigenes Modul programmiert habe...

Hier mal ein kleines Beispiel, wie's ohne Blender funktioniert:
Code fuer meinmodul.py:

Code: Alles auswählen

def meinefunktion():
    pass
Code fuer meinprogramm.py:

Code: Alles auswählen

import meinmodul

meinmodul.meinefunktion()
Beides in den gleichen Ordner gepackt, meinprogramm ausgefuehrt (python meinprogramm.py) --> sollte funktionieren (nicht, dass das Programm viel macht, aber es sollte kein Fehler auftauchen.)

Du koenntest jetzt mal genau dieses Beispiel aus Blender heraus ausfuehren. Wenn's nicht klappt, liegt es an Blender. Wenn ich heute abend zu Hause bin, koennte ich mir meinen alten Blender-Kram nochmal anschauen, vielleicht finde ich was.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Was mir gerade noch so einfaellt: Vielleicht hilft es ja, eine leere Datei namens __init__.py mit in den gleichen Ordner zu packen? :roll:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Also, ich habe mein obiges Beispiel mal in Blender ausgefuehrt, und es funktioniert, indem ich einfach nur beide Dateien in den gleichen Ordner lege.
(Getestet mit: Linux 2.4.21-303-default, Python 2.3+, Blender 2.36)

Vielleicht ist deine Benamsung tatsaechlich unguenstig, vielleicht ueberschreibst du dir irgendwo irgendwas?
Thanatos83
User
Beiträge: 12
Registriert: Dienstag 9. Mai 2006, 18:56

Hab jetzt andere Namen verwendet und die dateien sind immer noch im selben Ordner. Und ich habe auch ein Datei namens __init__.py mitreingepackt, aber es geht immer noch nicht.

Meldung: no module named meinmodule
Cu Thanatos83

Rettet die Wälder, esst mehr Biber!!!
Dakre
User
Beiträge: 16
Registriert: Dienstag 13. Juni 2006, 22:40

normalerweise sucht der python interpreter nach und nach an drei orten:
1. das verzeichnis, indem sich der interpreter selbst befindet ( nicht das programm)
2. Verzeichnisse, die in der Umgebungsvariablen PYTHONPATH aufgeführt sind
3. Standardverzeichnis, das von python speziell für module vorgesehen ist... z.B. /usr/lib/python oder c:\python23\Lib

du kannst mal die path variable checken... das tust du mit:

Code: Alles auswählen

>>> import sys
>>> sys.path
dieses zeigt die systemvariable PYTHONPATH an...

normalerweise müsste das lokale verzeichnis dort sein... ansonsten versuch's mal mit sys.path.append(r'c:\....')
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dakre, Python sucht zu allererst in dem Verzeichnis, in dem das ausfuehrende Script liegt, deswegen muesste es eigentlich auch so klappen.

Thanatos, wenn du sonst nichts weiter in deinem Programm machst, bin auch ratlos. Wie gesagt, falls es mit dem normalen Python-Interpreter funktioniert (wuerde ich ruhig mal ausprobieren, denn Blender benutzt seinen eigenen Interpreter), liegt's an Blender, da wendest du dich am besten an Blender-Leute (oder versuchtst, eine neuere/andere Blender-Version zu installieren...)

Oder aber bei Windows laueft irgenwas anders als bein Linux?
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Halli Hallo, ich dachte zuerst auch es wäre noch viel einfacher...
Mit bissl probieren gings aber ^^

Hier mal ein kleines Beispiel das funktioniert, ob es schön ist - keine Ahnung :)

Code: Alles auswählen

#IchBinEinModul.py
class IchBinEinModul:
  def __init__(self, argument):
    self.__argument = argument
    
  def methode(self):
    return self.__argument

Code: Alles auswählen

#RufeModulAuf.py

import IchBinEinModul

abc = IchBinEinModul.IchBinEinModul(5)
print abc.methode()
Rufe ich nun die RufeModulAuf.py auf gibt er mir in der Console:

Code: Alles auswählen

C:\Test\Python\>RufeModulAuf.py
5
Gruss
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es ist nicht so, das zwangsweise in einem Modul eine Klasse mit gleichem namen stecken muß!

Ich hab im Wiki mal ein weiteres Beispiel gemacht: [wiki]Modul Import#WeiteresBeispiel[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Hi,

könntest du mal die exakte Fehlermeldung (komplett) plus die Position der Dateien und die kompletten import-Befehle hinschreiben.
Vielleicht können wir dir dann helfen.

mfg
cime
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Kann es sein, dass Blenders Python nicht im aktuellen Verzeichnis nach modulen sucht?
@Thathanos: Was ergibt

Code: Alles auswählen

import sys
print sys.path
Dakre
User
Beiträge: 16
Registriert: Dienstag 13. Juni 2006, 22:40

Rebecca hat geschrieben:Dakre, Python sucht zu allererst in dem Verzeichnis, in dem das ausfuehrende Script liegt, deswegen muesste es eigentlich auch so klappen.
das tut er nur, weil normalerweise die "working directory" in PYTHONPATH gespeichert wird... deshalb ja meine empfehlung ähnlich wie joghurts doch mal in sys.path nachzugucken, ob sie drin steht...
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

Hallo zusammen,

ich denke meine Frage passt hier einigermaßen rein. Ich würde gerne ein Modul importieren. das Problem ist, dass das ganze nicht dort liegt wo das Programm liegt und er es nicht findet.
Wie kann ich bei einem Importbefehl einen Pfad mit angeben?

Sorry, hab mich beim suchen vertippt und deshalb nichts gefunden. Hat sich also erledigt.
Hier trotzdem die Lösung:

Code: Alles auswählen

sys.path.append('/path/to/file')
import xyz
Zuletzt geändert von tromai am Montag 19. Juni 2006, 13:14, insgesamt 1-mal geändert.
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Du kannst den Pfad, in der die neuen Module
liegen einfach hinzufügen und danach die besagten importieren.

Code: Alles auswählen

sys.path.append(PFAD)
import modul_aus_pfad
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Das Verzeichnis zu sys.path hinzufügen
Thanatos83
User
Beiträge: 12
Registriert: Dienstag 9. Mai 2006, 18:56

Das funktionert zwar, ist aber noch keine perfekte lösung. Gibt es denn keine möglichkeit den Pfad des Scriptes per Befehl rauszufinden?
Oder vielleicht relative Pfadangaben?

Es geht darum, dass ich das Script weitergeben will/muss, und es dann ohne umstellung auch vom anderen Rechner aus funktioniert.
Cu Thanatos83

Rettet die Wälder, esst mehr Biber!!!
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Thanatos83 hat geschrieben:Gibt es denn keine möglichkeit den Pfad des Scriptes per Befehl rauszufinden?
Gibt es:

Code: Alles auswählen

import os
print "Ich liege in", os.path.dirname(os.path.abspath(__file__))
Aber auch Blenderskripte werden in ein bestimmtes Verzeichnis gepackt, und das ist auch im sys.path drin, IIRC
Pythonaya
User
Beiträge: 90
Registriert: Sonntag 26. Januar 2003, 11:34
Wohnort: Großbeeren (nahe Berlin)

Also ich weiß ja, wie sehr ihr alle das Diskutieren um dieses Thema liebt und ich möchte euch auch nicht den Spaß verderben, aber vielleicht ist es sinnvoller sich vor dem Schreiben des Moduls einige Fragen zu stellen:

1. Was muss mein Modul leisten?
2. Ist es notwendig? Gibt es vielleicht schon andere Lösungen?
3. Wie bekomme ich es übersichtlich und strukturiert hingeschrieben?
4. ...

Ich habe ganz ehrlich gesagt Bauchweh, wenn in deiner einen Datei nur importiert wird. Ging es dir nur um die Theorie des Importierens/ Moduls oder wolltest du nur damit spielen?

Ich persönlich finde es viel angenehmer, wenn du in deiner "Hauptdatei" ruhig oben die Importierungen stehen hast.
Vorteil ist, dass du auf einen Blick siehst, was du importierst und wie usw.
Es erspart dir beim Fehler suchen zusätzlich enorm Zeit, weil du nicht immer die "Importierdatei" neben dein Programm legen musst...

Aber vielleicht sind das ja auch nur meine Auffassungen...
Also: Programmiert sauba Jungs (+Rebecca) ;-)
Antworten