Forum >> Principianti >> python non trova le librerie

Pagina: 1 2 Avanti

Salve, ho un vecchio sistema Linux (embedded, non pc) che include Python,

ma quando tento di caricare qualunque libreria ricevo un errore.

E' possibile che le librerie non esistano su questo sistema?





root@prim_arm:~# python
Python 2.7.3 (default, Feb 27 2013, 12:00:03)
[GCC 4.7.3 20121106 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import string
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named string
>>>


eh... magari è così. Prova a cercare manualmente la directory dell'installazione, e vedi che cosa c'è.
eh... magari è così. Prova a cercare manualmente la directory dell'installazione, e vedi che cosa c'è.

Scusa ma ma in quale directory dovrebbero essere le librerie?

Intanto mi sono accorto che import os e import sys funzionano,

quindi qualche libreria almeno esiste.


Invece import string e import math e molte altre non vengono trovate,

ma mi sembra assurdo che non esistano.



Scusa ma ma in quale directory dovrebbero essere le librerie?
Il discorso è piuttosto articolato, ma ti basti sapere che hai svariati metodi per capire velocemente le informazioni che ti servono. Iniziamo dal caro e molto semplice:
$ python -m site
Ti restituirà molte informazioni, sia per sapere dove sono i vari moduli, fornendoti anche indicazioni su eventuali directory personali presenti nella home dell'utente. Attenzione però, se esegui questo in un ambiente virtuale, avrai delle informazioni diverse e condizionate da questo ambiente.

Una volta conosciute queste informazioni, potrai capire dove sono le varie librerie e nessuno ti impedirà di andare fisicamente a spulciare dentro le directory per vedere cosa trovi. Visto che lo citi, ed hai sys a portata di mano, niente di vieta di sfruttarlo per avere delle informazioni (che in realtà è quello che hai fatto col precedente comando, ma vabbé):
$ python -c "import sys; print(sys.path)"
Otterrai praticamente le stesse informazioni, tranne che per le directory dell'utente, che potrai anche isolare con:
$ python -m site --user-site

Se invece vuoi sapere esattamente dove si trova un determinato modulo, sempre se esiste, lo puoi fare anche qui in svariati sistemi, ma diciamone uno per comodità:
$ python -c "import string as lb; print(lb.__file__)"
/usr/lib/python2.7/string.pyc
Non dimentichiamo neanche che l'esecuzione di python -v da riga di comando, ti dirà cosa viene importato e da dove. Questo è sempre molto utile se vuoi conoscere la posizione dei moduli integrati.

Ci sarebbero poi tutti i discorsi dei pacchetti di terze parti e/o presenti solo negli ambienti virtuali, magari installati con pip (pip list e pip show <lib> sarebbero i tuoi fidi alleati), ma credo che non siano interessanti per te, almeno non ora.

Boh, dimenticato qualcosa? Speriamo di no...

Cya

P.S. Ci sono delle differenze tra Python 2 e 3, così come su ambienti diversi (Linux, Windows, Mac), ma ho cercato di adattare il discorso al tuo Python 2.7 ed alla tua piattaforma.
Un'altra idea furba sarebbe


python -c "help('modules')"
che ha il side-effect di stampare la lista dei moduli disponibili. Se neppure "help" funziona, vuol dire che non hai neanche pydoc installato...


> Invece import string e import math e molte altre non vengono trovate,

> ma mi sembra assurdo che non esistano.

Ti sembra assurdo esattamente perché...? Lo hai detto tu stesso, no? Sistema embedded, avranno voluto risparmiare spazio.



--- Ultima modifica di RicPol in data 2019-03-02 10:10:43 ---
Grazie a entrambi, mi state dando un aiuto incommensurabile!

Ho tentato di dare i comandi che mi avete suggerito, ma questo è il risultato.

root@prim_arm:~# python -m site
Could not import runpy module
root@prim_arm:~# python -c "import sys; print(sys.path)"
['', '/usr/lib/python27.zip', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib]
root@prim_arm:~# python -m site --user-site
Could not import runpy module
root@prim_arm:~# python -c "import string as lb; print(lb.__file__)"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named string
root@prim_arm:~# python -c "help('modules')"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python2.7/site.py", line 472, in __call__
import pydoc
ImportError: No module named pydoc
root@prim_arm:~#


Mi pare che manchino proprio librerie importanti.

Dico che è assurdo perchè è una scheda di sviluppo/didattica, anche se non specifica per Python sul quale la documentazione della scheda non fa nessun cenno, però perchè metterci un Python azzoppato? E' un sistemino abbastanza potente basato su Arm con 1GB di ram e SD-card da 8 GB, quindi non c'era motivo di risparmiare spazio.


Potrebbe esserci qualche variabile d'ambiente da settare per indirizzarlo alle giuste directory?

Nel caso peggiore che proprio manchino le librerie, come si potrebbe rimediare?

Grazie infinite.



Mah sai, "una scheda di sviluppo/didattica" vuol dire tutto e niente. Le distribuzioni linux embedded sono spesso una giungla di infinite possibilità, spesso fatte un po' muzzo da smanettoni che credono di essere "clever" a "customizzare", ma in realtà non si rendono conto di fare pasticci. Va a sapere. Puoi sempre contattare chi ha fatto quella roba e chiedergli spiegazioni. O magari, hai visto mai, c'è un manuale di istruzioni? Nella storia della programmazione molti dubbi sono stati chiariti dai manuali di istruzioni.


Dopo di che, alla fine non è che si siano molte strade: dopo tutto, il modulo "string" non è altro che il file fisico "string.py" (che potrebbe essere string.pyc o string.pyo se per risparmiare spazio hanno tenuto solo le versioni compilate). Quindi fai una ricerca globale per "string.py*" o simili, e vedi se *ovunque* per caso c'è quel file. Se scopri una location particolare (diversa quindi da quelle di sys.path) dove sono conservati, per qualche misteriosa ragione, quei moduli "mancanti", non ti resta che aggiungerla manualmente a sys.path prima di importare i moduli (o aggiungerla una volta per tutte alla variabile d'ambiente pythonpath).





Dopo di che, sia chiaro, tutto questo è un esercizio accademico completamente inutile. Non ha comunque senso usare python 2.7 (e addirituttura una versione *vecchia* di python 2.7!) nel 2019. Quello che davvero ti conviene fare, è spianare tutto e installarci python 3.

Mah sai, "una scheda di sviluppo/didattica" vuol dire tutto e niente. Le distribuzioni linux embedded sono spesso una giungla di infinite possibilità, spesso fatte un po' muzzo da smanettoni che credono di essere "clever" a "customizzare", ma in realtà non si rendono conto di fare pasticci. Va a sapere. Puoi sempre contattare chi ha fatto quella roba e chiedergli spiegazioni. O magari, hai visto mai, c'è un manuale di istruzioni? Nella storia della programmazione molti dubbi sono stati chiariti dai manuali di istruzioni.
Ok, chiederò al fornitore ma dubito che dia questo supporto. Ho chiesto aiuto qui perché pensavo che fosse
più che altro un problema relativo a Python, qualcosa che andava
configurato.
Dopo di che, alla fine non è che si siano molte strade: dopo tutto, il modulo "string" non è altro che il file fisico "string.py" (che potrebbe essere string.pyc o string.pyo se per risparmiare spazio hanno tenuto solo le versioni compilate). Quindi fai una ricerca globale per "string.py*" o simili, e vedi se *ovunque* per caso c'è quel file. Se scopri una location particolare (diversa quindi da quelle di sys.path) dove sono conservati, per qualche misteriosa ragione, quei moduli "mancanti", non ti resta che aggiungerla manualmente a sys.path prima di importare i moduli (o aggiungerla una volta per tutte alla variabile d'ambiente pythonpath).




Già fatto, non c'è niente. E se prendessi i sorgenti di tutte le librerie da un sistema funzionante, per esempio da Ubuntu che sto usando in questo momento, le copiassi sul sistema embedded e le compilassi lì? Chiedo se è un'operazone possibile perché in realtà non saperei nemmeno come fare. Sto studiando Python proprio in funzione di questa scheda. In realtà questa scheda andrebbe programmata in C e su questo c'è tutta la documentazione e il supporto. Purtroppo non c'è un compilatore C nativo, perciò devo usare un cross compiler su PC (sotto windows) e poi trasferire l'eseguibile sulla scheda ed è quello che faccio normalmente. Speravo di semplificarmi la vita, almeno per semplici programmi, con Python.

Dopo di che, sia chiaro, tutto questo è un esercizio accademico completamente inutile. Non ha comunque senso usare python 2.7 (e addirituttura una versione *vecchia* di python 2.7!) nel 2019. Quello che davvero ti conviene fare, è spianare tutto e installarci python 3.






Se ci fosse un versione più aggiornata e funzionante di tutto il software per questa scheda lo farei volentieri! Ma questo è il mondo reale.




Mah guarda che non c'è proprio nulla da "copiare" e tanto meno da "compilare". Banalmente, spiana quella buffa non-installazione di python 2, e installaci una nuova versione di python 2 (se proprio vuoi darti una martellata sulle p** installando software obsoleto... ma saprai tu).


Se invece, per dire, ti serve "solo" un modulo o due della libreria standard (che so, "math", "string"...) puoi provare a copiare solo quei file manualmente accanto agli altri e incrociare le dita... certo però che se quei moduli a loro volta importano altri moduli che non ci sono... sei fritto ugualmente.


Dopo di che, in generale mi sa che stai andando fuori strada. Se quella scheda è un componente hardware legacy ma ormai insostituibile di un qualche sistema che assolve un compito per te importante, allora guarda che ti conviene usare il python che c'è sopra con tutti i limiti che ci sono: meno la tocchi, meglio è, soprattutto perché ormai è così obsoleta che se rompi qualcosa non è più facile trovare il supporto per aggiustarla.


Se invece stai usando un componente hardware obsoleto, con un software obsoleto, installato in modo incompleto, SOLO perché non c'hai voglia di spendere qualche decina di euro per accattarti un raspberry pi su Amazon... il mio consiglio sarebbe di spendere qualche decina di euro e accattarti un raspberry pi su Amazon.


Se vuoi imparare python, stai percorrendo la strada più tortuosa che abbia mai visto (e ne ho visto la mia parte, di strade tortuose).

Mah guarda che non c'è proprio nulla da "copiare" e tanto meno da "compilare". Banalmente, spiana quella buffa non-installazione di python 2, e installaci una nuova versione di python 2 (se proprio vuoi darti una martellata sulle p** installando software obsoleto... ma saprai tu).
Se ci fosse, lo farei volentieri.

Comunque, vorrei precisare che anche se è un sistema "vecchio" (2014), non c'è niente di obsoleto, è tuttora in produzione è non c'è niente di più nuovo che possa sostituirlo.


Si rivolge ad applicazioni specialistiche (=costose, c'è un chip che da solo costa sui 10 k$) dove il turn-over dell'hardware è di 10-15 anni e i numeri sono dell'ordine delle migliaia di pezzi, altro che i miliardi di smartphone! Per darti un'idea, ho dovuto tradurre in C un pezzo di programma in Fortran del 1973. Quindi tutto si evolve in modi inusuali.

Se invece, per dire, ti serve "solo" un modulo o due della libreria standard (che so, "math", "string"...) puoi provare a copiare solo quei file manualmente accanto agli altri e incrociare le dita... certo però che se quei moduli a loro volta importano altri moduli che non ci sono... sei fritto ugualmente.


Dopo di che, in generale mi sa che stai andando fuori strada. Se quella scheda è un componente hardware legacy ma ormai insostituibile di un qualche sistema che assolve un compito per te importante, allora guarda che ti conviene usare il python che c'è sopra con tutti i limiti che ci sono: meno la tocchi, meglio è, soprattutto perché ormai è così obsoleta che se rompi qualcosa non è più facile trovare il supporto per aggiustarla.


Se invece stai usando un componente hardware obsoleto, con un software obsoleto, installato in modo incompleto, SOLO perché non c'hai voglia di spendere qualche decina di euro per accattarti un raspberry pi su Amazon... il mio consiglio sarebbe di spendere qualche decina di euro e accattarti un raspberry pi su Amazon.


Se vuoi imparare python, stai percorrendo la strada più tortuosa che abbia mai visto (e ne ho visto la mia parte, di strade tortuose).



Purtroppo in questo momento non sono nella situazione di imparare un linguaggio solo per il gusto di impararlo. Devo impararlo e simultaneamente usarlo per lo scopo che mi serve. Il sistema è nato per essere programmato in C e se per far funzionare il Python perdo più tempo di quello che risparmierei, devo lasciare perdere e proseguire per la vecchia strada. Ad ogni modo ti ringrazio infinitamente della collaborazione.






Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.