Compilare programma Python in Pyenv

Configurazione e uso di IDE, editor, compilatori, in fase di programmazione.
josjos
Prode Principiante
Messaggi: 6
Iscrizione: venerdì 23 novembre 2018, 17:38
Distribuzione: Peppermint 9 Nine i686

Compilare programma Python in Pyenv

Messaggio da josjos »

Salve, nel mio sistema linux Peppermint 8 ho installato, in Pyenv, Python3.9 e 3.9-dev, i pacchetti presenti sono
$ pip list: altgraph 0.17, pip 20.2.3, pygame 2.0.1, pyinstaller 4.2, pyinstaller-hooks-contrib 2021.1, setuptools 49.2.1.
Nel tentativo di compilare un piccolo programma ricevo questo messaggio

Codice: Seleziona tutto

(attiv390) gippo@gippo-PN137AA-ABZ-a720-it ~ $ pyinstaller /media/gippo/91EA-DF86/Imparare/Compilati/PGM25b.py
198 INFO: PyInstaller: 4.2
199 INFO: Python: 3.9.0
206 INFO: Platform: Linux-4.15.0-140-generic-i686-with-glibc2.23
211 INFO: wrote /home/gippo/PGM25b.spec
218 INFO: UPX is not available.
222 INFO: Extending PYTHONPATH with paths
['/media/gippo/91EA-DF86/Imparare/Compilati', '/home/gippo']
pygame 2.0.1 (SDL 2.0.14, Python 3.9.0)
Hello from the pygame community. https://www.pygame.org/contribute.html
510 INFO: checking Analysis
511 INFO: Building Analysis because Analysis-00.toc is non existent
511 INFO: Initializing module dependency graph...
515 INFO: Caching module graph hooks...
535 WARNING: Several hooks defined for module 'win32ctypes.core'. Please take care they do not conflict.
550 INFO: Analyzing base_library.zip ...
12196 INFO: Processing pre-find module path hook distutils from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks/pre_find_module_path/hook-distutils.py'.
12198 INFO: distutils: retargeting to non-venv dir '/home/gippo/.pyenv/versions/3.9.0/lib/python3.9'
21019 INFO: Caching module dependency graph...
21463 INFO: running Analysis Analysis-00.toc
21498 INFO: Analyzing /media/gippo/91EA-DF86/Imparare/Compilati/PGM25b.py
22443 INFO: Processing module hooks...
22445 INFO: Loading module hook 'hook-pygame.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/pygame/__pyinstaller'...
22447 INFO: Loading module hook 'hook-xml.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
22636 INFO: Loading module hook 'hook-lib2to3.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
22765 INFO: Loading module hook 'hook-sysconfig.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
22807 INFO: Loading module hook 'hook-_tkinter.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23034 INFO: checking Tree
23060 INFO: checking Tree
23196 WARNING: Tcl modules directory /usr/share/tcltk/tcl8.6/../tcl8 does not exist.
23201 INFO: Loading module hook 'hook-encodings.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23402 INFO: Loading module hook 'hook-pickle.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23410 INFO: Excluding import of argparse from module pickle
23411 INFO: Loading module hook 'hook-distutils.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23417 INFO: Loading module hook 'hook-multiprocessing.util.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23421 INFO: Excluding import of test.support from module multiprocessing.util
23422 INFO: Excluding import of test from module multiprocessing.util
23422 INFO: Loading module hook 'hook-heapq.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23426 INFO: Excluding import of doctest from module heapq
23427 INFO: Loading module hook 'hook-distutils.util.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23433 INFO: Excluding import of lib2to3.refactor from module distutils.util
23434 INFO: Loading module hook 'hook-xml.etree.cElementTree.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23436 INFO: Loading module hook 'hook-difflib.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
23444 INFO: Excluding import of doctest from module difflib
23445 INFO: Loading module hook 'hook-pkg_resources.py' from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks'...
24795 INFO: Processing pre-safe import module hook win32com from '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/_pyinstaller_hooks_contrib/hooks/pre_safe_import_module/hook-win32com.py'.
25098 WARNING: Hidden import "pkg_resources.py2_warn" not found!
25098 WARNING: Hidden import "pkg_resources.markers" not found!
25103 INFO: Excluding import of __main__ from module pkg_resources
25202 INFO: Looking for ctypes DLLs
25410 INFO: Analyzing run-time hooks ...
25427 INFO: Including run-time hook '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py'
25441 INFO: Including run-time hook '/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgres.py'
25478 INFO: Looking for dynamic libraries
28389 INFO: Looking for eggs
28390 INFO: Python library not in binary dependencies. Doing additional searching...
Traceback (most recent call last):
  File "/home/gippo/.pyenv/versions/attiv390/bin/pyinstaller", line 8, in <module>
    sys.exit(run())
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/__main__.py", line 114, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/__main__.py", line 65, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/building/build_main.py", line 725, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/building/build_main.py", line 672, in build
    exec(code, spec_namespace)
  File "/home/gippo/PGM25b.spec", line 6, in <module>
    a = Analysis(['/media/gippo/91EA-DF86/Imparare/Compilati/PGM25b.py'],
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/building/build_main.py", line 242, in __init__
    self.__postinit__()
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/building/datastruct.py", line 160, in __postinit__
    self.assemble()
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/building/build_main.py", line 476, in assemble
    self._check_python_library(self.binaries)
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/building/build_main.py", line 569, in _check_python_library
    python_lib = bindepend.get_python_library_path()
  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/depend/bindepend.py", line 945, in get_python_library_path
    raise IOError(msg)
OSError: Python library not found: libpython3.9m.so, libpython3.9m.so.1.0, libpython3.9mu.so.1.0, libpython3.9.so.1.0
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.

    * On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)
Domande: è possibile compilare da pyenv? ho dimenticato di installare qualche package?
grazie per il supporto....
giuseppe
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1413
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Compilare programma Python in Pyenv

Messaggio da nuzzopippo »

josjos ha scritto:
venerdì 2 aprile 2021, 18:07

Codice: Seleziona tutto

  File "/home/gippo/.pyenv/versions/3.9.0/envs/attiv390/lib/python3.9/site-packages/PyInstaller/depend/bindepend.py", line 945, in get_python_library_path
    raise IOError(msg)
OSError: Python library not found: libpython3.9m.so, libpython3.9m.so.1.0, libpython3.9mu.so.1.0, libpython3.9.so.1.0
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.

    * On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)
Domande: è possibile compilare da pyenv? ho dimenticato di installare qualche package?
Prendimi con le molle, ho utilizzato poco pyinstaller ma, si, ho creato eseguibili direttamente da venv (in genere utilizzo l'opzione "--onefile"), comunque dalla riga
OSError: Python library not found: libpython3.9m.so, libpython3.9m.so.1.0, libpython3.9mu.so.1.0, libpython3.9.so.1.0
mi fa pensare che si aspetti delle librerie a livello di sistema, ora non saprei circa il Tuo sistema ma su Ubuntu 20.04 la versione di python è la 3.8x, non la 3.9, dai in "python3 --version" per conoscere quale hai Tu.

Approfondisci prima, ma sempre in Ubuntu 20.04

Codice: Seleziona tutto

nuzzo@nuzzo-bax:~$ sudo apt list | grep python3.9-dev

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libpython3.9-dev/focal-updates 3.9.0-5~20.04 amd64
libpython3.9-dev/focal-updates 3.9.0-5~20.04 i386
python3.9-dev/focal-updates 3.9.0-5~20.04 amd64
python3.9-dev/focal-updates 3.9.0-5~20.04 i386
nuzzo@nuzzo-bax:~$ 
vedo che è presente un "python3.9-dev ... se avessi il Tuo problema, personalmente, proverei ad installarlo a livello di sistema, come indicato nel traceback anche se è da precisare che evito come la peste di utilizzare versioni non di default nel sistema (non dovrebbero dare fastidio ma sai mai)

Ciao
[Edit] dimenticavo, vi sono diverse altre librerie per python 3.9 presenti (basta togliere il "-dev"), possibile vi sia qualche ingerenza? (quel "libpython3.9-dev" da da pensare)
Fatti non foste a viver come bruti ...
josjos
Prode Principiante
Messaggi: 6
Iscrizione: venerdì 23 novembre 2018, 17:38
Distribuzione: Peppermint 9 Nine i686

Re: Compilare programma Python in Pyenv

Messaggio da josjos »

Ciao. L'istruzione sudo apt list | grep python3.9-dev mi restituisce

Codice: Seleziona tutto

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
libpython3.9-dev/xenial 3.9.3-1+xenial1 i386
python3.9-dev/xenial 3.9.3-1+xenial1 i386
L'istruzione lsb_release -a mi restiruisce

Codice: Seleziona tutto

No LSB modules are available.
Distributor ID:	Peppermint
Description:	Peppermint 8 Eight
Release:	8
Codename:	xenial
quindi quale versione di Python devo installare se voglio compilare un programma?

Aggiungo l'output del comando inxi -Fz

Codice: Seleziona tutto

gippo@gippo-PN137AA-ABZ-a720-it ~ $ inxi -Fz
System:    Host: gippo-PN137AA-ABZ-a720-it Kernel: 4.15.0-140-generic i686 (32 bit)
           Desktop: Xfce 4.12.3 Distro: Peppermint Eight
Machine:   System: HP Pavilion 061 product: PN137AA-ABZ a720.it v: 0B-0211RE101OXFOR00
           Mobo: ASUSTeK model: Oxford v: 1.xx
           Bios: American Megatrends v: 3.28 date: 08/27/2004
CPU:       Single core Intel Pentium 4 (-HT-) cache: 1024 KB 
           clock speeds: max: 2999 MHz 1: 2999 MHz 2: 2999 MHz
Graphics:  Card: Advanced Micro Devices [AMD/ATI] RV280 [Radeon 9200 PRO]
           Display Server: X.Org 1.19.6 drivers: ati,vesa (unloaded: fbdev,radeon)
           Resolution: 1280x1024@60.02hz
           GLX Renderer: Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 DRI2
           GLX Version: 1.3 Mesa 17.0.2
Audio:     Card Intel 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
           driver: snd_intel8x0
           Sound: Advanced Linux Sound Architecture v: k4.15.0-140-generic
Network:   Card: Realtek RTL-8100/8101L/8139 PCI Fast Ethernet Adapter
           driver: 8139too
           IF: enp2s15 state: unknown speed: 100 Mbps duplex: full mac: <filter>
Drives:    HDD Total Size: 3160.6GB (0.6% used)
           ID-1: /dev/sda model: Maxtor_6Y160P0 size: 160.0GB
           ID-2: USB /dev/sdb model: 006 size: 2000.4GB
           ID-3: USB /dev/sdc model: Elements_25A2 size: 1000.2GB
Partition: ID-1: / size: 104G used: 15G (15%) fs: ext4 dev: /dev/sda4
           ID-2: swap-1 size: 4.00GB used: 0.00GB (0%) fs: swap dev: /dev/sda3
RAID:      No RAID devices: /proc/mdstat, md_mod kernel module present
Sensors:   None detected - is lm-sensors installed and configured?
Info:      Processes: 219 Uptime: 17 min Memory: 634.5/2011.7MB
           Client: Shell (bash) inxi: 2.2.35 
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1413
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Compilare programma Python in Pyenv

Messaggio da nuzzopippo »

josjos ha scritto:
domenica 4 aprile 2021, 17:26
quindi quale versione di Python devo installare se voglio compilare un programma?
beh, se Ti sei creato un venv 3.9 vuol dire che la versione python3.9 la hai già installata nel Tuo sistema, quindi il discorso "prudenziale" cui io mi attengo (utilizzare solo la versione python3 di default nel mio sistema) è probabilmente già stato superata (puoi vedere quale versione python è default nel Tuo sistema dando da terminale "python3 --version")

Comi Ti ho detto in precedenza prendimi con le molle, ho usato poco pyinstaller ed ho dato solo qualche superficiale scorsa al manuale giusto quando mi serviva, comunque, ho avuto un caso di compilazione per una applicazione GUI utilizzante diverse librerie al di fuori della standard che falliva.
Utilizzavo python 3.8.5, di default nel mio sistema, per tentare di risolvere mi leggevo il traceback sino ad individuare il primo caso di errore, in genere era il make che non trovava una qualche libreria, individuavo la libreria, installavo il package relativo (a livello di sistema) e riprovavo, ho eseguito l'operazione più volte, ogni volta superavo il punto precedente ma il make si bloccava su qualche altra libreria mancante, si è risolto quando mi è venuto in mente di installare (sempre a livello di sistema) le "buil-essential", ho compilato e utilizzato il file eseguibile su altre macchine, ovviamente copiandolo in locale e dando i permessi di esecuzione.

Ora, so che come "indicazione" è un po' sui generis ma se toccasse a me risolvere il Tuo problema probabilmente farei qualcosa di analogo a quanto su (magari installerei le buld-essential per prime), cioè mi cercherei nel chilometrico traceback di pyinstaller il primo punto di errore e cercherei di risolverlo per poi proseguire.

Di più, allo stato, non sono in grado di dirTi, al più, se ritieni, definisci un esempio minimale che utilizza le librerie "extra-standard" che utilizzi e Ti da analoghi errori con pyinstaller che provo a creare un venv 3.9, installarci le librerie che utilizzi e provo anch'io a compilarlo e vediamo che si riesce a fare.

Ciao
Fatti non foste a viver come bruti ...
josjos
Prode Principiante
Messaggi: 6
Iscrizione: venerdì 23 novembre 2018, 17:38
Distribuzione: Peppermint 9 Nine i686

Re: Compilare programma Python in Pyenv

Messaggio da josjos »

Dunque, ho installato in pyenv la versione python3.7 ma naturalmente la compilazione del pgm non ha funzionato perché mancavano questi tre moduli libpython3.7.so.1.0, libpython3.7m.so.1.0, libpython3.7mu.so.1.0; ho attivato e cercato in Synaptic questo modulo libpython3.7 dalla lista dei moduli visualizzati ho installato Libpython3.7 Libpython3.7-dev Libpython3.7-minimal Libpython3.7-stdlib. A questo punto la compilazione del programmino è terminata correttamente. La compilazione ha creato un nuovo modulo con estensione "pyc" che ho potuto eseguire solo con la versione Python3.
E' stato un bel esercizio ma questo programma può essere eseguito solo da chi ha la stessa versione di Python (3).
E' possibile compilare un programma che possa essere distribuito ed eseguito su versioni diverse di Python?
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1413
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Compilare programma Python in Pyenv

Messaggio da nuzzopippo »

josjos ha scritto:
martedì 6 aprile 2021, 18:09
E' possibile compilare un programma che possa essere distribuito ed eseguito su versioni diverse di Python?
No.

Può, però, essere creato un eseguibile "autosufficiente", contenente cioè tanto il python in uso quanto le librerie necessarie : sia main.py il punto di avvio del "programmino" dai il comando :

Codice: Seleziona tutto

pyinstaller --onefile main.py
ti copi il file nella directory "dist" che viene creata e lo trasferisci sullo hard disk della macchina su cui lo vuoi usare e dai i permessi di esecuzione, dovrebbe funzionare ... a dire il vero non sono proprio certo che vada tutto liscio (in genere le mie macchine linux sono sincronizzate come versioni, anche di python) ma sulle mie ha funzionato anche in assenza di vari moduli di libreria tra l'una e l'altra.

Tieni presente che un eseguibile creato con linux girerà solo su sistemi linux, lo stesso vale per windows e mac.
[Edit] naturalmente, anche le versioni 32-64 bit dei vari s.o. NON sono tra loro mutuabili.
Fatti non foste a viver come bruti ...
josjos
Prode Principiante
Messaggi: 6
Iscrizione: venerdì 23 novembre 2018, 17:38
Distribuzione: Peppermint 9 Nine i686

Re: Compilare programma Python in Pyenv

Messaggio da josjos »

Sono riuscito a compilare il pgm, la compilazione ha creato 2 cartelle "build" e "dist", nella cartella "dist" ho la versione del pgm compilato ma senza estensione (15 mb per poche righe di programma). Il doppio clic sul programma mi restituisce questo messaggio

Codice: Seleziona tutto

The file's encoding is invalid for Python 3.x. 
IDLE will convert it to UTF-8.
What is current encoding of the file?
che tipo di "endcoding" devo impostare nel source del programma? ho seguito alcuni suggerimenti ma non ne sono venuto a capo.
nuzzopippo, grazie ancora per il supporto.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1413
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Compilare programma Python in Pyenv

Messaggio da nuzzopippo »

josjos ha scritto:
mercoledì 7 aprile 2021, 18:09
nella cartella "dist" ho la versione del pgm compilato ma senza estensione (15 mb per poche righe di programma)...
Mi sembra più che normale, considerando che gli eseguibili di python, della libreria standard e dei moduli aggiuntivi sono compresi.

Per quanto riguarda il "non riconoscimento", anche esso è "normale" il Tuo gestore dei file, probabilmente, gestirà i files in base alla loro estensione, ed il Tuo file non ne ha, il mio fa comparire questa finestra
Immagine

Il file che hai compilato NON È installato nel Tuo sistema, verrà trattato come un archivio compresso.
Per testarlo dagli i permessi di esecuzione e lancialo da terminale, ugualmente dovrai fare su eventuali altre macchine su cui voglia usarlo, poi magari ti fai un piccolo script di lancio od un file ".desktop" di avvio.

Tieni presente che l'installazione di programmi in un sistema linux si effettua tramite "pacchetti" (deb, rpm, etc) che hanno una loro strutturazione che Tu non hai implementato, hai solo utilizzato un mezzo "sbrigativo" per evitarti la faticata di crearti un installer specifico per il sistema di destinazione, ciò vale per tutti i sistemi operativi, nessuno escluso, anche se, magari, le versioni windows potrebbero anche funzionare con il doppio-clic diretto, rinominandolo come ".exe", non saprei per certo dato che non uso windows da vent'anni.

Ciao

[Edit] dimenticavo

Per quanto riguarda gli script del codice, normalmente metto la codifica adottata quale prima riga (o seconda se uso la shebag), si indica così :

Codice: Seleziona tutto

# -*- coding: utf-8 -*-
ovviamente, utilizzando la codifica caratteri utf-8 (default nei sistemi linux ma non "assolutamente" certo), altrimenti la codifica adottata nel redigere lo script
Fatti non foste a viver come bruti ...
Scrivi risposta

Ritorna a “Strumenti per la programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite