Írtam egy package-t, ami szépen működik, de elég bénán építettem fel a hierarchiáját - import-ok keresztbe kasul és amúgy se mondható rendezettnek. Keresem a módot, hogy miként lehetne olyan package-t írni, ami egy másikba ágyazva is ugyanúgy működik, mintha csak egymagában használnám. Ez alapjába véve nem is lenne gond, de szeretném a közös cuccokat az __init__.py-be tenni és itt jön a probléma, ugyanis ha import pack
-kal használom, akkor a pack.kozos_cucc
néven elérem ezeket a függvényeket/változókat, viszont a from pack import *
nem tölti be őket.
Persze, a válasz egyszerű, miért nem használom az első megoldást és minden elé kiírom a csomag nevét? Azért, mert a tkinter is az __init__.py-ben tárolja a legtöbb objektumát, mégis működik az import tkinter
és a from tkinter import *
egyaránt, tehát valszeg én vagyok képzetlen.
Mi a szabványos módja annak, hogy egy csomagon belül hivatkozzak a saját __init__.py-re, és hogy az abban található deklarációkat a main fájl a fent említett import módok közül bármelyikkel elérje?
EDIT:
Hogy gyakorlati példán is mutassam:
______________________________ KÖNYVTÁRSZERKEZET _____________________________
main.py
pack/
__init__.py
egyik.py
subpack/
__init__.py
masik.py
___________________________________ FÁJLOK ___________________________________
__ MAIN.PY ____________________________
import sys
import pack
import pack.egyik
import pack.subpack
import pack.subpack.masik
print( sys.modules[ __name__ ] )
print( pack.var )
pack.egyik.fgv()
print( pack.subpack.var )
pack.subpack.masik.fgv()
__ PACK/__INIT__.PY ___________________
import sys
__all__ = [ 'egyik' ]
var = sys.modules[ __name__ ]
__ PACK/EGYIK.PY ______________________
import sys
import pack
def fgv():
print( sys.modules[ __name__ ], pack.var )
__ PACK/SUBPACK/__INIT__.PY ___________
import sys
__all__ = [ 'masik' ]
var = sys.modules[ __name__ ]
__ PACK/SUBPACK/MASIK.PY ______________
import sys
import pack.subpack
def fgv():
print( sys.modules[ __name__ ], pack.subpack.var )
__________________________________ KIMENET ___________________________________
<module '__main__' from 'foo\main.py'>
<module 'pack' from 'foo\pack\__init__.py'>
<module 'pack.egyik' from 'foo\pack\egyik.py'> <module 'pack' from 'foo\pack\__init__.py'>
<module 'pack.subpack' from 'foo\pack\subpack\__init__.py'>
<module 'pack.subpack.masik' from 'foo\pack\subpack\masik.py'> <module 'pack.subpack' from 'foo\pack\subpack\__init__.py'
Az import tkinter
és a from tkinter import *
dolgot félreérthettem, mert a fenti példában mindkét módon működik az '__init__.py'-kben lévő deklarációk importálása.
Azt akarom elérni, hogy ha nem a 'main.py', hanem az 'egyik.py' a fő fájl, amiből indítoma progit, akkor is működjön az 'egyik' és a 'subpack' és mindkettő lássa a 'subpack/__init__.py'-ben deklarált változókat, osztályokat, függvényeket. Ehhez viszont az kell, hogy képes legyen dinamikusan importálni a saját '__init__' fájlját és a 'subpack'-ot is, mert ha ez nem így történne, az import pack.subpack
-ot kézzel kéne átírni import subppack
-ra és ez szerintem nem épp professzionális megoldás.
- 5252 megtekintés
Hozzászólások
Nem felejtetted el az __all__-t kitölteni?
http://docs.python.org/2/tutorial/modules.html#importing-from-a-package
- A hozzászóláshoz be kell jelentkezni
Próbáltam egyértelműbbé tenni a kérdést, lásd feljebb.
--
A kényszer helyett a tudásvágy vezessen a tanulásban!
- A hozzászóláshoz be kell jelentkezni
Ha nagyon nem jön válasz, akkor lehet, hogy nem csak én nem értem. ;)
(szégyen vagy sem, tényleg képtelen vagyok felfogni, hogy mit szeretnél, de még próbálkozom, hátha...)
- A hozzászóláshoz be kell jelentkezni
Egyelőre még ez tűnik a leghasználhatóbb megoldásnak, de az exec
-ben nem bízok meg túlzottan és amúgy is szigszalagos megoldásnak tűnik, szóval biztos van erre normálisabb mód is, de mindenesetre ez a megoldás a modult tartalmazó package nevével tér vissza:
packname = __name__ .split( '.' )
del packname[-1]
packname = '.'.join( packname )
if packname:
exec( 'import ' + packname )
- A hozzászóláshoz be kell jelentkezni
Én se értem, mit is szeretnél pontosan. Esetleg ha írnál egy _komplett_ példát valami hibaüzenettel...
--
♙♘♗♖♕♔
- A hozzászóláshoz be kell jelentkezni
A tények azt mutatják, hogy én magyarázok érthetetlenül... (-_-')
Írtam egy programot, amin belül létrehoztam egy package-be ágyazott "subpackage"-t. A program kibővült, átalakult és az a helyzet állt fel, hogy a "subpackage" egy könyvtárral feljebb kell, hogy kerüljön, viszont ehhez a "subpackage" moduljaiban lévő import utasításokat át kell írnom, mert a modulok útvonala megváltozott ugyebár. Ugyan ezt megtehetem kézzel is, de mivel ilyen probléma máskor is felmerülhet, egy általánosabb megoldást keresek, ami mindig a megfelelő import utasításokat fogja használni, bárhol is legyen a "subpackage" a könyvtárszerkezetben a "main" fájlhoz képest.
--
A kényszer helyett a tudásvágy vezessen a tanulásban!
- A hozzászóláshoz be kell jelentkezni
Ha jól emlékszem, van valami relatív útvonal megadási lehetőség is.
import .pack formában v. valami hasonlóban.
Ez nem jó? Ha nem, akkor továbbra sem értem ;)
- A hozzászóláshoz be kell jelentkezni
Asszem ez lesz a megoldás: from .. import pack
Köszi érte! :) Létezik rá általánosan bevált módszer, hogy egy pack-ban lévő modul miként importálhatja a saját __init__-jét, vagy ez a bevett megoldás?
--
A kényszer helyett a tudásvágy vezessen a tanulásban!
- A hozzászóláshoz be kell jelentkezni