Topic: Distribuire le proprie applicazioni  (Letto 1803 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline n3c0

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Distribuire le proprie applicazioni
« il: Aprile 03, 2017, 13:49 »
Salve a tutti, lo so che dal titolo direte: ma si è parlato mille volte di questo argomento, ma io non ne vengo a capo, perdonate la mia inesperienza....Ho provato a cercare, ma non ho trovato risposte "aggiornate"...

L'obiettivo ovviamente è quello di creare un exe per far partire la propria applicazione anche su altri pc (windows), preciso che ho scritto il codice su windows e che dall'IDLE funziona tutto.

Primo problema: Ho provato Pyinstaller, ma incappo in questo errore "IndexError: tuple index out of range".
Secondo: Ho cercato delle alternative, ma non ho trovato altri "compilatori" (se così li possiamo chiamare), compatibili con python 3.6...
Terzo: C'è un modo per proteggere il codice sorgente? Cioè nasconderlo e non poterlo "risalire"?

Grazie a tutti

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #1 il: Aprile 03, 2017, 14:50 »
> Primo problema: Ho provato Pyinstaller, ma incappo in questo errore "IndexError: tuple index out of range".

Ora, capisci bene che questo non è certo un problema di pyinstaller.


Comunque sì, Pyinstaller o Cx_freeze sono le alternative "normali" che funzionano relativamente bene. Ovvio che ci sono i corner case insidiosi, etc etc. Bisogna capire bene come funzionano questi strumenti, leggere bene la documentazione (ma proprio bene bene bene bene bene, facendoci attenzione frase per frase, perdendoci un sacco di tempo sopra, staccando il telefono, rinunciando a pokemon go per una giornata, ragionando su ogni passaggio... chiaro? Non "bene" come in genere si intende "bene", eh?).
Come dico anche nella mia guida (in firma), distribuire programmi python in forma di exe è una delle prime cose che vorrebbero fare i principianti, ma è anche una delle ultime cose che interessa fare ai non-principianti, ed è comunque una cosa difficile in linea di principio. Però si può fare, ci mancherebbe.

Offline n3c0

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #2 il: Aprile 03, 2017, 15:43 »
Ok capisco che ho ancora molto da imparare....ma come si distribuisce allora un programma scritto in python? c'è bisogno di installare tutto l'interprete sempre?

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Distribuire le proprie applicazioni
« Risposta #3 il: Aprile 05, 2017, 10:12 »
Terzo: C'è un modo per proteggere il codice sorgente? Cioè nasconderlo e non poterlo "risalire"?

Certo. Non distribuirlo affatto. Detto questo,non ti sembra prematuro preoccuparsi di questo?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #4 il: Aprile 05, 2017, 11:12 »
> .ma come si distribuisce allora un programma scritto in python? c'è bisogno di installare tutto l'interprete sempre?

Anche questo è stato spiegato un po' di volte, qui sul forum. Comunque ripetiamo, ripetiamo.

In primo luogo distinguiamo tra "distribuire librerie scritte per sviluppatori" e "distribuire software per l'utente finale". Nel primo caso, si distribuisce con PyPI o anche rendendo pubblica una repository (Github, Bitbucket, quello che vuoi) e dicendo alla gente di clonare da lì. Questi sono strumenti per sviluppatori, ovviamente. Ma il fatto è che Python è un linguaggio destinato soprattutto a scrivere strumenti per sviluppatori (a differenza, che so, di Delphi, o di Visual Basic, o che so io).

Se invece parliamo di "distribuire software per l'utente finale", allora distinguiamo tra il software a cui l'utente accede "come un servizio", e il software che l'utente per poterlo usare ha proprio bisogno di installarlo fisicamente sul suo computerino nel salotto di casa attaccato alla tv con la presa scart, disconnesso dal mondo, come se fossimo negli anni '90.
Nel primo caso, il software è installato da qualche parte su un server (dove ovviamente si presuppone che sia installato anche Python), da qualche amministratore che l'utente manco conosce, e l'utente ci accede tipicamente attraverso un web server, o qualcosa del genere. Quando usi Disqus, o Instagram, o YouTube, stai usando software scritti in Pyhton per l'utente finale (che sei tu), e che sono installati su un server, e a cui tu accedi senza bisogno di "installare" niente sul tuo computer nel salotto di casa. Questa è la stragrande maggioranza del software "per l'utente finale" oggi scritto in Python.

Nell'ultimo scenario (sofware per l'utente finale, e distribuito fisicamente per essere "installato" come negli anni '90), in generale si possono prendere due strade.
La migliore, quella preferibile, è semplicemente distribuire i tuoi moduli python così come sono, richiedendo quindi che l'utente abbia l'interprete Python già installato sul suo computer. E' esattamente la stessa cosa che succede nel mondo Java, e nessuno si lamenta.
Chissà per quale stortura mentale, invece, i principianti immaginano che nel mondo Python gli sviluppatori abbiano voglia di compilare e distribuire i loro software come eseguibili auto-sufficienti. Ma il fatto è che Pyhton NON è un linguaggio fatto per essere compilato (come c/c++). Python è (come Java) un linguaggio con virtual machine, e il bello della virtual machine è appunto che ti risparmia il dolore di dover compilare per distribuire su diverse piattaforme. Se ti metti a distribuire compilando, allora devi compilare un eseguibile diverso per ciascuna piattaforma, e il processo di distribuzione del software in generale torna a essere una via crucis come era appunto negli anni '90. E nessuno ha voglia di tornare agli anni '90, se può farne a meno, capisci. (A questo punto il niubbo puntualmente interrompe e dice "ma io sono su windows, e a me interessa solo windows". Sì, bravo, abbiamo capito. Ma se sbirci fuori dalla finestrella, vedi che là fuori c'è un modo un po' più grande del tuo windows. E chi programma in python, in genere ha in mente tutto il mondo, non solo lo stanzino di windows).

L'ultima strada, infine, è appunto quella di distribuire come eseguibile auto-sufficiente, in qualche modo "compilato" (il mio exe! il mio exe! ecco il mio exe! exexexe!, a questo punto esclama il niubbo tutto emozionato).  Per tutti i motivi che ti ho spiegato fin qui e molti altri ancora, ovviamente questa è la via crucis che tutti gli sviluppatori cercano di evitare come la peste.
E hai due strade (ancora). Se il tuo software è "abbastanza semplice" da permetterlo (e il 90% dei casi è così), allora puoi usare Pyinstaller o Cx_freeze che funzionano (banalmente, creano un pacchetto dove dentro c'è l'eseguibile di python e il tuo programma correttamente linkato. Chiudi gli occhi, incroci le dita, e funziona tutto). Se invece il tuo software è "troppo complicato" per questi strumenti automatici, allora devi lavorare sodo.
Per esempio, guarda Calibre: https://calibre-ebook.com/demo#screenshots. Calibre è scritto in Pyhton.
Ora, su windows Calibre è distribuito compilando tutti i componenti con Visual Studio pilotato da cmake, e poi pacchettizzato con WiX. Visual Studio? cmake? WiX? E che roba è tutto questo? Buon lavoro a imparare queste cose leggendo le note sulla compilazione dell'autore di Calibre: https://github.com/kovidgoyal/calibre/blob/master/setup/installer/windows/notes.rst.  E questo vale per windows, naturalmente. Poi puoi leggere le note per le altre piattaforme.
E non è che WiX sia l'unica strada. E' solo un esempio che ho visto di recente.


Offline tommyb1992

  • python neanderthalensis
  • ****
  • Post: 300
  • Punti reputazione: 0
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #5 il: Aprile 07, 2017, 08:50 »

Nell'ultimo scenario (sofware per l'utente finale, e distribuito fisicamente per essere "installato" come negli anni '90), in generale si possono prendere due strade.
La migliore, quella preferibile, è semplicemente distribuire i tuoi moduli python così come sono, richiedendo quindi che l'utente abbia l'interprete Python già installato sul suo computer. E' esattamente la stessa cosa che succede nel mondo Java, e nessuno si lamenta.
Chissà per quale stortura mentale, invece, i principianti immaginano che nel mondo Python gli sviluppatori abbiano voglia di compilare e distribuire i loro software come eseguibili auto-sufficienti. Ma il fatto è che Pyhton NON è un linguaggio fatto per essere compilato (come c/c++). Python è (come Java) un linguaggio con virtual machine, e il bello della virtual machine è appunto che ti risparmia il dolore di dover compilare per distribuire su diverse piattaforme. Se ti metti a distribuire compilando, allora devi compilare un eseguibile diverso per ciascuna piattaforma, e il processo di distribuzione del software in generale torna a essere una via crucis come era appunto negli anni '90. E nessuno ha voglia di tornare agli anni '90, se può farne a meno, capisci. (A questo punto il niubbo puntualmente interrompe e dice "ma io sono su windows, e a me interessa solo windows". Sì, bravo, abbiamo capito. Ma se sbirci fuori dalla finestrella, vedi che là fuori c'è un modo un po' più grande del tuo windows. E chi programma in python, in genere ha in mente tutto il mondo, non solo lo stanzino di windows).

Questa parte interessa molto a me, anche se paradossalmente io non venderò mai un SW in quanto non interessato a lavorare in questo campo, però non escludo un giorno di voler passare qualcosa a terze parti.

I moduli di cui parli però sono comunque leggibilli? (intendo il source code)
Ipotizzo, perchè se richiedi la Virtual Machine allora vuol dire che essa deve leggere per poter interpretare, altrimenti non vedrei manco il vantaggio di avere una VM per la portabilità del codice.

Ovviamente OP chiedeva come compilare il codice, perchè diciamocelo, disassemblare un programma, soprattutto se lungo ha senso quasi 0, fai prima a scriverlo insomma...

E ora ho un'altra domanda: immaginando che l'utente finale abbia la VM, posso compilare solo i moduli che ho programmato io?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #6 il: Aprile 07, 2017, 11:27 »
> I moduli di cui parli però sono comunque leggibilli?

Ah già. dimenticavo... l'altra faqqona del niubbo... scusa ma anche qui, è una domanda talmente ovvia e talmente tanto già risposta, che basta una ricerca sul forum o dovunque in rete...
Comunque ripetiamo, ripetiamo.

La risposta di Riko che forse hai preso sul ridere era invece seria e l'unica giusta. Se non vuoi che i misteriosi segreti del tuo software siano scoperti (eh caspita, che sarà mai), allora l'unico modo è N-O-N distribuire il software. Ripeto, NON distribuire il software. Ripeto ancora, è l'unico modo.
Ripeto ancora perché talvolta ho la sensazione di non essere chiaro: se non vuoi che qualcuno riesca a "leggere" i tuoi moduli, non distribuirli. Metti il tuo software a disposizione come un servizio, dietro un web server, e nessuno potrà mai "leggerlo". Soluzione che, come già detto, è anche la più conveniente dal punto di vista della meccanica della distribuzione, come ti ho già spiegato.

Se lasci che l'utente abbia fisicamente sulla sua macchina i file del tuo programma, allora sicuramente non c'è modo di nascondere nulla. Puoi offuscare, distribuire dei pyc, fare quello che vuoi. Ma esistono decompilatori, analizzatori, è sempre possibile ricostruire il sorgente.

Poi capisco che il niubbo alle primissime armi, prima ancora di aver scritto la sua prima riga di codice, pensa che il problema più importante del mondo sia "come proteggerò i preziosi segreti che rendono il mio codice così unico, geniale, innovativo, e come riuscirò a impedire a tutti di copiarmi e replicare il mio travolgente successo?".
Ma fidati, non sarà questo il caso. Il problema più importante è imparare a programmare, imparare Python, e scrivere del codice che funziona. Se e quando poi arriverai a scrivere del codice che può interessare degli altri utenti, per quell'epoca avrai già scoperto che devi convincerli, i tuoi potenziali utenti. E per farti una reputazione devi pubblicarlo, il tuo codice, e devi permettere agli altri di testarlo, capire che non è dannoso, permettergli di intervenire con bug fix e pull request... E' proprio un modo diverso, oggi, di scrivere e pubblicare il codice. Non siamo più negli anni '90.


> Ovviamente OP chiedeva come compilare il codice, perchè diciamocelo, disassemblare un programma, soprattutto se lungo ha senso quasi 0, fai prima a scriverlo insomma...

Ti sfugge il cuore del problema: il senso di "disassemblare" un programma è tanto maggiore quanto maggiore è il valore del programma. O meglio, il valore che sta intrinsecamente nel codice (in opposizione, per esempio, al valore delle sue funzionalità).

Offline en_py

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #7 il: Dicembre 11, 2020, 20:54 »
Salve a tutti, mi scuso per scrivere dopo tutto questo tempo, ma voglio riallacciarmi alla discussione aggiungendo una domanda. Premetto che sono d'accordo (come non esserlo del resto) con tutto quanto detto e non sono un programmatore, ma mi diletto nel tempo libero.

E' chiaro che ci sono molte strade percorribili, ma a volte per alcuni software fatti "ad hoc" per un cliente o collega (io non sono un informatico, ma faccio altro, solo che mi è capitato di realizzare dei tools software molto specifici per aiutare il mio o il lavoro di altri ingegneri) il famigerato .exe potrebbe essere la soluzione.

Tutte le mie domande si riferiscono a raggiungere una corretta distribuzione del software da VENDERE senza incappare in citazioni da parte di qualcuno (ad esempio da chi ha realizzato le PyQt o altri moduli importati in python).

Il vostro sarà solo un consiglio tra appassionati, ma sicuramente ne capite più di me, per avere un punto di partenza.

Quindi la mia domanda è la seguente: una volta creato il file .exe, nel caso specifico che utilizza le PyQt, Matplotlib, Numpy, ecc. importati come moduli, posso venderlo, ovviamente allegando anche il file sorgente? Se sì, posso usare, o mi conviene, la GPLv3 come licenza?

Seconda domanda, sempre in ottica di licenza: se, invece, uso un altro metodo di distribuzione, tipo una web app in flask, quindi utilizzabile raggiungendo un sito internet, posso farne pagare l'utilizzo senza le problematiche di cui sopra? (Ad esempio registrazione a pagamento per usufruire del servizio)

Terza domanda: se utilizzo la distribuzione stile Java, cioè senza eseguibile, cambia qualcosa in riferimento alla licenza e alla vendibilità?

Ultima domanda: pyinstaller è in grado di operare in 2 modi, o crea l'exe oppure accorpa una serie di file senza fare l'eseguibile, sarebbe questa seconda opzione quella che descrivete come simile alle distribuzioni Java? Oppure devo proprio installare una versione di Python sul computer dell'utente finale e poi tutti i moduli usati e infine copiare il file .py del software?

Vi ringrazio in anticipo!

Enrico

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #8 il: Gennaio 12, 2021, 15:12 »
Per determinare la licenza del tuo sofware, scegli prima la licenza che ti piacerebbe usare. Poi guarda tutte le licenze di tutti i componenti che usi, e scopri se ti permettono di redistribuire con la licenza che vorresti tu. Se un componente non te lo permette, i casi sono due: o cambi la tua licenza, o non usi quel componente.

Offline en_py

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Distribuire le proprie applicazioni
« Risposta #9 il: Gennaio 12, 2021, 15:29 »
Per componenti intendi tutti gli import, ossia le librerie varie, di terze parti?