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...
Messaggio nascosto da :
Spam
Puoi mantenere lo spazio dei nomi del modulo eseguendo il pacchetto come modulo invece che come script, ad esempio con python -m lanmessage.starter dalla directory superiore a lanmessage, assicurandoti che contenga un __init__.py per essere riconosciuto come pacchetto.

--- Ultima modifica di ㎝ in data 2025-11-03 12:16:43 ---
Puoi mantenere lo spazio dei nomi del modulo eseguendo il pacchetto come modulo invece che come script, ad esempio con python -m lanmessage.starter dalla directory superiore a lanmessage, assicurandoti che contenga un __init__.py per essere riconosciuto come pacchetto.
Intendi utilizzare lo "__init__.py" nella directory radice della applicazione per inizializzare la stessa? ... idea interessante che non mi era venuta in mente, Ti ringrazio, la testerò senz'altro




Ciao
Fatti non foste a viver come bruti...
Ciao caro, ricordo molto chiaramente la lettura di un libro di Leo Giordani del quale non ricordo il nome, ma che fu propedeutico per la configurazione di alcuni progetti non proprio piccini. E' di svariati anni fa, pre-Covid, ma se lo trovi può darti qualche spunto. Ecco magari non tutto perché i tempi cambiano molto velocemente, ma c'è del bello anche in una vecchia macchina da scrivere.


Cya
Grazie della segnalazione @Palmux, credo Tu riferisca a questo testo, purtroppo (per me) in inglese, che a quanto ho capito parla di architetture software e le affronta tramite python ... si, in sostanza credo che tratti il tipo di "nozioni" di cui avrei bisogno, il mio bagaglio culturale è carente di tali argomenti.


Guarderò un po' ciò che l'autore rende disponibile e, se mi riesce di acquisire qualcosa di utile, cercherò di acquistarlo anche se temo che dovrò scrivermi un "traduttore offline" per poterlo utilizzare (non sono anglofono ... i "ndo' vai" me li do spesso da solo)




Edit: od anche questo, più specifico per l'argomento?, probabimente, ed anche questo in inglese :(


--- Ultima modifica di nuzzopippo in data 2025-11-03 15:53:03 ---
Fatti non foste a viver come bruti...
Grazie della segnalazione @Palmux, credo Tu riferisca a questo testo, purtroppo (per me) in inglese, che a quanto ho capito parla di architetture software e le affronta tramite python ... si, in sostanza credo che tratti il tipo di "nozioni" di cui avrei bisogno, il mio bagaglio culturale è carente di tali argomenti.
Bravo era quello che avevo letto a suo tempo, 2018... cavolo come vola il tempo.



Edit: od anche questo, più specifico per l'argomento?, probabimente, ed anche questo in inglese :(

Questo non lo conosco.

Cya


Pagina: 1



Esegui il login per scrivere una risposta.