Modul im Package auch für sich ausführen: Importproblem

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
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

Gegeben folgende Verzeichnisstruktur:

[codebox=text file=Unbenannt.txt]paket_versuche
haupt.py
pypack
__init__.py (leer)
mod_a.py
mod_b.py
[/code]
mod_a.py import nichts. mod_b.py importiert mod_a. haupt.py importiert mod_a und mod_b. Jedes Modul hat eine Funktion, die etwas tut und dazu eine kleine main-Funktion zum Testen und den entsprechenden Abschnitt

Code: Alles auswählen

if __name__ == "__main__":
	main()

Das Problem: ich bekomme den Import von mod_a in mod_b nicht so hin, dass ich sowohl haupt.py als auch mod_b.py ausführen könnte.

Import in haupt.py:

Code: Alles auswählen

import pypack.mod_a
import pypack.mod_b
Importversuche in mod_b.py:

Code: Alles auswählen

import pypack.mod_a as ma  # Variante a
import mod_a as ma         # Variante b
Variante a: Ausführen von haupt.py klappt ohne Fehler; Ausführen von mod_b.py ergibt:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\Sibylle\Src\Python\paket_versuche\pypack\mod_b.py", line 5, in <module>
    import pypack.mod_a as ma
ModuleNotFoundError: No module named 'pypack'
Variante b: Jetzt lässt sich mod_b.py ausführen, aber haupt.py nicht:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:/Sibylle/Src/Python/paket_versuche/haupt.py", line 8, in <module>
    import pypack.mod_b
  File "D:/Sibylle/Src/Python/paket_versuche\pypack\mod_b.py", line 6, in <module>
    import mod_a as ma
ModuleNotFoundError: No module named 'mod_a'
Die Dokumentation hat mir nicht weitergeholfen, in diesem Forum habe ich auch nichts Passendes gefunden. Geht das nicht, was ich möchte? Dann müsste ich wohl Tests der Moduln in pypack auf die gleiche Ebene verlagern, auf der das Hauptprogramm schon liegt?

Das Ganze mit Python 3.6.1 unter Windows 10, aber das spielt wahrscheinlich hier keine Rolle.

Für den Fall, dass jemand sich das näher ansehen möchte, hier der komplette Code:

Code: Alles auswählen

# mod_a.py
# In pypack

def test(msg):
    print("Hier mod_a.test mit Text '{}'".format(msg))

def main():
    test("Meldung")

if __name__ == "__main__":
    main()

Code: Alles auswählen

# mod_b.py
# In pypack

#import pypack.mod_a as ma   # Variante a
import mod_a as ma          # Variante b

def test(msg):
    print("Hier mod_b.test mit Text '{}'".format(msg))
    ma.test("mod_b ruft mod_a mit <{}>".format(msg))
    

def main():
    test("Meldung")

if __name__ == "__main__":
    main()

Code: Alles auswählen

#!/usr/bin/env python3
# haupt.py
# Hauptprogramm für Paketversuche

import pypack.mod_a
import pypack.mod_b

def test(msg):
    print("Hier haupt.test mit Text '{}'".format(msg))
    pypack.mod_a.test("haupt ruft mod_a mit <<{}>>".format(msg))
    pypack.mod_b.test("haupt ruft mod_b mit <<{}>>".format(msg))

def main():
    test("Meldung")

if __name__ == "__main__":
    main()
BlackJack

@bb1898: Module in Packages führt man mit der ``-m``-Option aus. Also ``python haupt.py``, ``python -m pypack.mod_a``, und `python -m pypack.mod_b`` um das jeweilige Modul auszuführen und dabei sollte man sich im Verzeichnis befinden in der ``haupt.py`` und das ``pypack``-Package befinden.

Edit: Und der Import in den beiden Modulen im Package sollte jeweils ``from pypack import mod_b`` oder ``import pypack.mod_b`` oder ``from . import mod_b`` lauten.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

BlackJack hat geschrieben:@bb1898: Module in Packages führt man mit der ``-m``-Option aus. Also ``python haupt.py``, ``python -m pypack.mod_a``, und `python -m pypack.mod_b`` um das jeweilige Modul auszuführen und dabei sollte man sich im Verzeichnis befinden in der ``haupt.py`` und das ``pypack``-Package befinden.
Das hatte ich schon ausprobiert, muss dabei aber irgend etwas falsch gemacht haben - beim erneuten Versuch hat es funktioniert. Jetzt sollte ich noch klären, ob und wie sich das auch von einer IDE aus machen lässt (Wing oder IDLE). Offensichtlich ist das nicht.
Edit: Und der Import in den beiden Modulen im Package sollte jeweils ``from pypack import mod_b`` oder ``import pypack.mod_b`` oder ``from . import mod_b`` lauten.
Meine Variante a, das ist dann klar.
Antworten