Come importare una libreria personalizzata in Python senza incappare in errori?

👤 Iniziato da @elenamorelli
📅 15/10/2025 19:00
📁 Programmazione 🌐 IT
Avatar di elenamorelli
Ciao a tutti, sto lavorando su un progetto un po' fuori dal comune, dove ho creato una libreria personalizzata per rendere il mio codice più unico e non come tutti gli altri. Volevo importarla nel mio script principale, ma continuo a ricevere un fastidioso ImportError. Uso Python 3.12 e ho già provato ad aggiungere il percorso con sys.path.append(), ma non serve a niente. Ecco un esempio di quello che ho scritto:

```python
import mia_libreria

# Poi il resto del codice
```

L'errore esatto è: ModuleNotFoundError: No module named 'mia_libreria'. Ho controllato la struttura delle cartelle e provato vari trucchi, ma niente. Voi che siete più esperte, avete consigli per approcci originali o esperienze simili? Magari sto sottovalutando qualcosa di semplice. Aiutatemi a sbloccare questa situazione, per favore!
Avatar di rosaricci40
Ah, il classico "ho fatto tutto giuro ma non funziona"! Dai, smettila di incaponirti con `sys.path.append()` e ascolta la voce della saggezza sarcastica. Hai messo un `__init__.py` nella cartella della tua libreria? No? Ecco perché Python ti ignora come un ex dopo aver scoperto che hai il cartellino della maglia ancora attaccato.

Se invece c'è, controlla che la struttura delle cartelle sia tipo:
```
progetto/
├── main_script.py
└── mia_libreria/
├── __init__.py
└── moduli_vari.py
```

E poi, magia, importala con `from mia_libreria import roba_fighissima`. Se proprio vuoi essere hipster, usa `pip install -e .` con un setup.py, ma temo che sia troppo stile "chef stellato" per te al momento.

PS: Sei sicura che il nome del modulo non abbia typi? Perché Python è pignolo come un professore di grammatica.
Avatar di titoserra70
Fammi capire: hai creato la cartella 'mia_libreria' nello stesso directory del tuo script principale? Perché se no, il problema è che Python non la cerca dove pensi. Il trucco con sys.path.append() funziona solo se aggiungi il percorso ASSOLUTO del folder che contiene 'mia_libreria', non della libreria stessa. Prova a stampare sys.path prima dell'import per verificare che il path sia corretto. Poi controlla che 'mia_libreria' abbia __init__.py (vuoto o con exports), altrimenti diventa una namespace package e non importa. Se stai su Linux/Mac, puoi anche creare un symlink in /usr/local/lib/python3.12/site-packages/mia_libreria che punta alla tua cartella: roba da smanettoni, ma funziona. Ah, e dimenticati gli approcci "originali": in ambito dev l'unica cosa figa è scrivere codice che gira senza rompere le scatole. Poi, se proprio ci tieni all'unicità, crea un decorator personalizzato per i tuoi moduli. Quello sì che è stile.
Avatar di yarrowlombardi51
Ciao Elena, ho letto la tua richiesta e mi sono immaginato la tua frustrazione. È davvero fastidioso quando si è sicuri di aver fatto tutto correttamente, ma qualcosa non funziona.

Prima di tutto, assicurati che la tua cartella `mia_libreria` contenga un file `__init__.py`. Questo è fondamentale perché senza di esso, Python non riconoscerà la cartella come un modulo.

Secondo, verifica la struttura delle tue cartelle. Dovrebbe essere simile a questa:

```
progetto/
├── main_script.py
└── mia_libreria/
├── __init__.py
└── moduli_vari.py
```

Se la struttura è corretta, prova a stampare `sys.path` prima di tentare l'importazione per verificare che il percorso sia corretto. Potrebbe essere che stai aggiungendo il percorso sbagliato con `sys.path.append()`.

Un'altra cosa che potresti provare è l'uso di `pip install -e .` direttamente dalla cartella della tua libreria. Questo è un po' più avanzato, ma può risolvere problemi di path in modo pulito.

Infine, se hai seguito tutti i passaggi e continua a non funzionare, potresti avere un problema di configurazione del tuo ambiente Python. In tal caso, un reinstallare Python o creare un ambiente virtuale pulito potrebbe essere la soluzione.

Ricorda, la perseveranza è la chiave. Non demordere, prima o poi troverai la soluzione!
Avatar di reesevitale
Hai controllato se la directory 'mia_libreria' è un sottodir del main script? Perché se hai una struttura tipo:
```
progetto/
├── main.py
└── src/mia_libreria/...
```
e aggiungi `src/` a sys.path, l'import diventa `from src.mia_libreria import cosa`. Se invece la cartella è nella stessa directory di main.py, assicurati di non aver aggiunto path con slash finali o percorsi parziali (es. `sys.path.append('mia_libreria/')` invece di `sys.path.append('.')` per includere la root).

Altro test: esegui il main da terminale nella directory principale, non in una sottocartella. Python usa la pwd per risolvere gli import relativi, non la posizione dello script.

Se proprio non funziona, usa `importlib.util` per caricare il modulo per forza bruta:
```python
import importlib.util
spec = importlib.util.spec_from_file_location("mia_libreria", "/path/assoluto/mia_libreria/__init__.py")
mia_lib = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mia_lib)
```
Ma sappi che è roba da sfigati con problemi di struttura. Il vero problema è che stai usando `sys.path.append()` come un pifferaio magico invece che organizzare i file correttamente. La prossima volta fai un pacchetto con setup.py e `pip install -e .` che fa tutto da solo.
Avatar di elenamorelli
Grazie, @reesevitale, per i tuoi spunti taglienti e diretti – adoro come non giri intorno al problema, proprio come me che vado controcorrente! Hai colto nel segno con i path e il consiglio su setup.py; proverò a sistemare la mia struttura per evitare di sembrare una sfigata con il codice. Credo che questo risolva il mio casino originale.
Avatar di vladimiromoretti51
@elenamorelli, ma dài, non sei una sfigata. Però se ci tieni a non sembrarlo, piantala con setup.py: è roba da dinosauri. Oggi si usa pyproject.toml, punto.

La struttura la devi sistemare davvero: se la libreria è nel src/, sposta pure lì il main script o usate gli import relativi. E quando esegui, stai nella root del progetto, non in sottocartelle.

Ah, e smettila di appendere path a cazzo. Se sei su Unix, fai `PYTHONPATH=src python main.py` e basta. Così eviti pasticci e sembri una che sa il fatto suo.

Poi, se proprio devi giocare sporco, l’hack di Reese con importlib funziona ma è una schifezza da usare solo in casi disperati. Tipo quando devi leggere moduli da percorsi dinamici e hai una buona scusa per non strutturare il progetto decentemente.

Quindi: pulisci la struttura, usa pyproject.toml, PYTHONPATH e virtualenv. E non ti vergognare degli errori, tutti ci passiamo. Ma evita di diventare una che appende path come se piovesse.

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!