Forum >> Programmazione Python >> Scripting >> Punto di avvio di una applicazione modulare

Pagina: 1

I miei saluti

Nel corso del tempo ho preso l'abitudine di strutturare le mie applicazioni secondo una struttura da "modulo standard", articolata in sub-moduli specializzati per tipologia d'uso, giusto per esempio segue l'articolazione di una cosetta correntemente in saltuaria implementazione

NzP:~$ tree
.
├── lanmessage
│   ├── gui
│   │   ├── confgui.py
│   │   ├── groupgui.py
│   │   ├── __inity__.py
│   │   ├── login.py
│   │   ├── messagesgui.py
│   │   ├── panels.py
│   │   ├── pwdchanger.py
│   │   └── winmain.py
│   ├── __init__.py
│   ├── starter.py
│   ├── utility
│   │   ├── __init__.py
│   │   └── utility.py
│   └── work
│       ├── data_manager.py
│       ├── __init__.py
│       ├── linux_manager.py
│       ├── notifiers.py
│       └── windows_manager.py
└── start.py

4 directories, 18 files
NzP:~$
Tale tipo di implementazione da alcune "complicazioni" nello spazio dei nomi che malgrado abbia letto un po' di documentazione ed alcune PEP (tra cui la 420, che ho deciso di non utilizzare) non mi riesce di superare, probabilmente per mia incapacità di comprensione, confesso che spazio dei nomi ed uso dei files "__init__.py" mi confonde un po'.

Dette complicazioni, essenzialmente, corrispondono alla circostanza che se utilizzo, per l'avvio della applicazione, un file interno alla struttura del pacchetto, l'assegnazione del "__main__" quale "nome" fa perdere allo stesso modulo lo spazio dei nomi del "pacchetto" ... mi spiego: supposto un file di inizializzazione (lanmessage.starter.py) della applicazione così composto:

# -*- coding: utf-8 -*-

# imports da libreria base
import os

# imports da virtual environment
import appdirs

# import locali
from lanmessage.gui.winmain import WinMain


def def_dirs() -> dict:
    '''
    Definisce le directory da utilizzarsi nella applicazione.
    Nella eventualità non esistano, le crea.
    '''
    app_name = 'lan_message'
    app_author = 'nuzzopippo'
    app_dirs = {}
    app_dirs['data'] = appdirs.user_data_dir(app_name, app_author)
    app_dirs['cache'] = appdirs.user_cache_dir(app_name, app_author)
    app_dirs['log'] = appdirs.user_log_dir(app_name, app_author)
    app_dirs['state'] = appdirs.user_state_dir(app_name, app_author)
    app_dirs['config'] = appdirs.user_config_dir(app_name, app_author)
    try:
        for key in app_dirs.keys():
            if not os.path.exists(app_dirskey) or not os.path.isdir(app_dirskey):
                os.makedirs(app_dirskey)
    except OSError as e:
        print(repr(e))
        exit(1)
    return app_dirs


def go() -> None:
    app_dirs = def_dirs()
    win = WinMain(app_dirs)
    win.mainloop()


if __name__ == '__main__':
    go()

Eseguendolo direttamente viene perso lo spazio dei nomi del modulo

NzP:~$ source /home/nuzzopippo/venvs/tests_v/bin/activate
(tests_v) NzP:~$ /home/nuzzopippo/venvs/tests_v/bin/python3.10 /home/nuzzopippo/
                 src/my_work/LanMessage/src/lanmessage/starter.py
Traceback (most recent call last):
  File "/home/nuzzopippo/src/my_work/LanMessage/src/lanmessage/starter.py", line
       8, in <module>
    from lanmessage.gui.winmain import WinMain
ModuleNotFoundError: No module named '\lanmessage'
(tests_v) NzP:~$
A ciò ovvio implementando un semplice punto di avvio (start.py) al di fuori del pacchetto applicativo, nrl caso in specie è così fatto:

# -*- coding: utf-8 -*-

from lanmessage import starter

'''
TODO

DIRAMAZIONI X NOTIFICHE :

Per Linux   : Studiare ed implementare notify2 - python-dbus
Per Windows : Studiare ed implementare Windows-Toasts

'''

starter.go()
Ora, tal modo di procedere, seppur funzionante non mi sembra "giusto", ogni tanto mi pongo il problema ma, come detto, non mi è riuscito, al momento, di trovare modalità altre ... la domanda è : è possibile utilizzare lanmessage.starter.py quale punto di avvio della applicazione conservando lo spazio dei nomi del modulo? Se si, come si può fare?




Grazie dell'attenzione

Fatti non foste a viver come bruti...


Pagina: 1



Esegui il login per scrivere una risposta.