Topic: Creare script da eseguire su terminale con setuptools  (Letto 153 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline biagiolicari7

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Creare script da eseguire su terminale con setuptools
« il: Gennaio 31, 2019, 18:46 »
salve a tutti, avrei un problema da risolvere. Ho terminato un mio progetto a cui dovrei aggiungere degli script da eseguire una volta installato tramite setuptools.
Per esempio, una volta installato il pacchetto creato da me, da terminale dovrei poter scrivere qualcosa come Compress(nome funzione presente nel progetto) -r -v (esempio di opzioni usabili) file1,file2 (lista file da dare in pasto alla funzione)

com'è possibile fare un qualcosa del genere ? grazie mille !

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 40
  • Punti reputazione: 0
    • Mostra profilo
Re:Creare script da eseguire su terminale con setuptools
« Risposta #1 il: Gennaio 31, 2019, 19:54 »
Ciao  :)

[Spero di non aver frainteso completamente la richiesta]

Certamente gli utenti più esperti sapranno dare indicazioni molto più efficaci, ma un metodo molto semplice è utilizzare il modulo "sys" per leggersi i parametri passati allo script.
Stabilendo, p.e., che il primo di tali parametri sia la funzione da richiamare ed i successivi quelli da "utilizzare" ... ti posto un semplice esempio, fatto al volo, supposto uno script "test.py" così costituito:
# -*- coding: utf-8 -*-

import sys


def get_numero(strnum):
    try:
        return int(strnum)
    except ValueError:
        try:
            return float(strnum)
        except ValueError:
            pass
    return None

def vedi_numero(strnum):
    num = get_numero(strnum)
    if num:
        print('Hai inserito il numero', num)
    else:
        print(strnum, 'mica è un numero!')


def leggi_testo(parole):
    print('Ricevuto:')
    for p in parole:
        print(p, end=' ')
    print()


if __name__ == '__main__':
    param = sys.argv
    if len(param) < 3:
        print('Utilizzo : python test.py nome_funzione parametro1 ... [parametro n]')
        exit()
    if param[1] == 'vedi_numero':
        vedi_numero(param[2])
    elif param[1] == 'leggi_testo':
        parole = param[2:]
        leggi_testo(parole)
    else:
        print('Funzione', param[1], 'non supportata')


sarà possibile richiamare, a scelta la funzione "vedi_numero()" (con un ulteriore parametro) o "leggi_testo()" (con una lista di parametri),output di esempio.
Ovviamente, la "scelta" viene effettuata nel blocco istruzioni di "if __name__ == '__main__':"

Un esempio di esecuzione:

NzP:~$ python3 test.py vedi_numero 125
Hai inserito il numero 125
NzP:~$ python3 test.py vedi_numero 12.5
Hai inserito il numero 12.5
NzP:~$ python3 test.py vedi_numero 12,5
12,5 mica è un numero!
NzP:~$ python3 test.py leggi_testo Apelle figlio di Apollo
Ricevuto:
Apelle figlio di Apollo
NzP:~$ python3 test.py leggi_numero 125
Funzione leggi_numero mom supportata
« Ultima modifica: Gennaio 31, 2019, 19:58 da nuzzopippo »

Offline bebo

  • python erectus
  • ***
  • Post: 220
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Creare script da eseguire su terminale con setuptools
« Risposta #2 il: Gennaio 31, 2019, 23:46 »
"arrrggv": nomen omen ;-)
Come ti ha mostrato nuzzopippo, con sys.argv ci puoi fare degli script interattivi (anche se l'esempio e' un po' "complesso").

Consiglio pero' di guardarsi argparse, modulo della libreria interna di python: https://docs.python.org/3/library/argparse.html
Qui c'e' anche un tutorial: https://docs.python.org/3/howto/argparse.html

Ci spenderai forse qualche minuto in piu', ma se vorrai fare degli script un po' piu' smart ti salvera' ore di lavoro.

Offline biagiolicari7

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Creare script da eseguire su terminale con setuptools
« Risposta #3 il: Febbraio 01, 2019, 12:13 »
"arrrggv": nomen omen ;-)
Come ti ha mostrato nuzzopippo, con sys.argv ci puoi fare degli script interattivi (anche se l'esempio e' un po' "complesso").

Consiglio pero' di guardarsi argparse, modulo della libreria interna di python: https://docs.python.org/3/library/argparse.html
Qui c'e' anche un tutorial: https://docs.python.org/3/howto/argparse.html

Ci spenderai forse qualche minuto in piu', ma se vorrai fare degli script un po' piu' smart ti salvera' ore di lavoro.

cosi ho risolto quasi tutti i problemi, l'unica cosa che non riesco a risolvere è che per eseguire lo script ( mettiamo caso si chiami compression.py) devo scrivere nel terminale compression.py, mentre dovrei poter scrivere solo compression [file] ecc... un pò come i comandi unix. come potrei risolvere ? grazie mille !

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 40
  • Punti reputazione: 0
    • Mostra profilo
Re:Creare script da eseguire su terminale con setuptools
« Risposta #4 il: Febbraio 01, 2019, 13:11 »
cosi ho risolto quasi tutti i problemi, l'unica cosa che non riesco a risolvere è che per eseguire lo script ( mettiamo caso si chiami compression.py) devo scrivere nel terminale compression.py, mentre dovrei poter scrivere solo compression [file] ecc... un pò come i comandi unix. come potrei risolvere ? grazie mille !

È necessario che il file di script abbia l'estensione?
Essendo null'altro che un file di testo interpretato credo possa anche non esserci alcuna estensione nel nome del file, python se lo mastica comunque ... appena provato nel mio sistema ed è proprio così, vedi giù

NzP:~$ cp inv_cf.py inv_cf
NzP:~$ python3 inv_cf
Codice fiscale :
NzP:~$

l'estensione del file è sostanzialmente una "utilità", non una necessità (tra parentesi ero venuto proprio per lumi su di una particolarità derivata da quel file di codice :) )

@bebo, interessante la Tua indicazione, non la conoscevo (ovviamente) e nemmeno immaginavo qualcuno avesse codificato una libreria per gestire i parametri di una chiamata ...

Offline bebo

  • python erectus
  • ***
  • Post: 220
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Creare script da eseguire su terminale con setuptools
« Risposta #5 il: Febbraio 01, 2019, 13:59 »
Se sei su unix, l'estensione e' irrilevante.
L'importante e' lo shebang all'inizio; io di solito metto:
#!/usr/bin/env python3


Se ti fai un giro tra gli eseguibili in /usr/bin/ vedrai che molti sono degli script con uno shebang in cima.

PS: e ovviamente rendere eseguibile il file:
$ chmod +x /path/to/file

Offline biagiolicari7

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Creare script da eseguire su terminale con setuptools
« Risposta #6 il: Febbraio 02, 2019, 16:52 »
grazie mille ! un'ultima cosa, ho scritto il mio script che ho inserito dentro la cartella script, il codice è questo (ancora da completare e migliorare)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Feb  1 10:44:17 2019

@author: Biagio
"""

import argparse
import src.File_Manager, src.converter

parser = argparse.ArgumentParser()  # Creiamo il nostro parser
parser.add_argument('file',help='lista file o dir da comprimere con lzw',type = str)
gruppo = parser.add_argument_group() # Creiamo il gruppo necessario per le visualizzazioni
gruppo2 = parser.add_argument_group()
gruppo.add_argument("-r", "--ricorsivo", action="store_true")
gruppo2.add_argument("-t","--trie", action="store_true")
gruppo2.add_argument("-d","--dict", action="store_true")
gruppo.add_argument("-v","--verbose", action="store_true")

arg = parser.parse_args()


if arg.ricorsivo and arg.trie :
    src.File_Manager.write_dir(arg.file,'t')
elif arg.ricorsivo and arg.dict:
    src.File_Manager.write_dir(arg.file,'d')
elif arg.ricorsivo :
    src.File_Manager.write_dir(arg.file,'t')
if arg.trie and not arg.ricorsivo :
    src.File_Manager.write_file(arg.file,'t')
elif arg.dict and not arg.ricorsivo :
    src.File_Manager.write_file(arg.file,'d')
else:
    src.File_Manager.write_file(arg.file,'t')



mentre il mio setup.py è questo
#!/usr/bin/env python3

from distutils.core import setup

setup(name='Lempel-Ziv-Welch',
      version='1.0.0',
      description='Lempel-Ziv-Welch compressor and decompressor',
      license='MIT',
      packages=['src','script'],
      scripts = ['script/compress.py', 'script/uncompress.py'],
     )


facendo da prompt windows : python setup.py install, mi va tutto a buon fine e i comandi funzionano. Passando a linux invece mi esce sempre errore di 'modulo non trovato ecc...'. Ho provato a cambiare la pythonpath ma non è servito a nulla. consigli ? grazie mille !