Topic: [Risolto] Aprire documenti con applicazione grafica predefinita nel sistema  (Letto 449 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
I miei saluti :)

Essendomi stata richiesto, in ufficio, di rendere disponibile una piccola utilità che mi hanno visto utilizzare (uno script bash) ho preso la palla al balzo per realizzarla in python (view testuale, x me, e grafica, per gli altri : ottimo per studiarsi MVC), in un giorno è mezzo ho realizzato la parte funzionale ... poi, sottovalutando la cosa, ho pensato di mettere una "ciliegina sulla torta", nella parte grafica, ossia di rendere possibile l'apertura di files (testo o pdf nel caso) con le applicazioni grafiche predefinite nel sistema.

... ci ho perso su un altro giorno (scoprendo un bel po' di cose da studiarmi), sconfortandomi sul sorgente di "platform" (solo windows ha 'na tragedia di versioni)  alla fine ho strutturato poco fa una rozza funzione sulla base di ricerche varie tutte da approfondire. La funzione sarebbe questa :

def show_file(f):
    '''
    "Cerca" di aprire un file con la applicazione grafica predefinita nel sistema

    return
    --- True se riesce ad aprirlo
        ovvero
        False se non ci riesce
    '''
    # tentativo con linux
    try:
        subprocess.run(['xdg-open', f], check=True)
        return True
    except:
        pass
    # tentativo con windows
    try:
        # os.startfile(f) # ? non esiste in os
        os.system('start ' + f)
        return True
    except:
        pass
    # forse mac?
    try:
        subprocess.call('open', f)
        return True
    except:
        pass
    # ... vabbeh, ci ho provato
    return False

Riguardo linux funziona, per windows vedrò domani (per mac chissa :( )

... Non è molto importante e certamente ho molti aspetti da approfondire ma, dato che al momento il lavoro mi lascia pochissimo tempo, se ci fosse qualche suggerimento lo ascolterei con piacere.

Grazie dell'attenzione, ciao :)
« Ultima modifica: Febbraio 04, 2020, 08:38 da nuzzopippo »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #1 il: Gennaio 30, 2020, 09:29 »
brrr...
prima di tutto non capisco perché, *solo* per windows, devi usare os.system... usa subprocess come per gli altri, no? Sembrano ricettine copincollate da fonti diverse... comunque os.system è deprecato da un decennio, ormai... davvero io non capisco come fate ancora a trovare in giro questi esempi con os.system...

Dopo di che, "provarle tutte una dopo l'altra" è veramente... cioè... https://xkcd.com/1654/ boh.
Tanto più che questo "return True / return False" funziona solo se tieni le dita incrociate. In realtà ci possono essere milioni di motivi per cui la chiamata a subprocess potrebbe fallire, oltre che non sei nella piattaforma giusta e/o la piattaforma non ha un modo standard per aprire quel file.
Usa sys.platform per capire dove sei, e regolati di conseguenza.

Infine, ripetiamo per chiarezza, non illuderti di poter usare il tuo "return True" come un segnale che il file si sia davvero aperto....

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #2 il: Gennaio 30, 2020, 10:58 »
brrr...

 :D
Capisco benissimo, lo ho pensato a mia volta mentre scrivevo quella funzione ma al momento non ho tempo da dedicare all'argomento (veramente a nessun argomento) ... dovresti vedere la ciofeca che ho scritto per l'encoding!, in effetti sono ricettine incollate (x linux da miei script bash) per una faccenda marginale, se fosse stata significativa avrei utilizzato java, che però mi ha dato agio a provare a tirar fuori una modellazione MVC/Observer che ha funzionato come pensavo "dovesse", questa "modellazione" era ciò che mi premeva realmente (spero di trovare il tempo per sottoporla al parere del Forum), in attesa di completare una prova più complessa che ho dovuto mettere in attesa.
Allo stato, affrontare i diversi s.o. mi è prematuro, e molti argomenti attendono approfondimento, ho appurato che su win7 e win10 quella funzione va ed al momento può bastare.

Appena possibile seguirò il Tuo consiglio su subprocess e platform (l'ho guardata e capito di non aver tempo sufficiente ora)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #3 il: Gennaio 30, 2020, 14:22 »
Mah sai non è che ci sia tanto da sudare

def viewfile(f):
    try:
        launcher = {'linux':'xdg-open',
                    'win32':'start',
                    'darwin':'start'}[sys.platform]
    except KeyError:
        return
    subprocess.run([launcher, f])

poi certo, bisogna decidere che cosa fare in caso di fallimento...
« Ultima modifica: Gennaio 30, 2020, 14:25 da RicPol »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #4 il: Gennaio 30, 2020, 15:06 »
Mah sai non è che ci sia tanto da sudare
...
poi certo, bisogna decidere che cosa fare in caso di fallimento...

Grazie della indicazione, la proverò tornato a casa.

Per il fallimento è facile, se li aprono a mano i file, per un aggratis è anche troppo! ;)  :D

Comunque, non è il "sudore", la mia questione è comunque il "capire", mi è necessario approfondire notevolmente subprocess ed affrontare platform, "win32" e "darwin" li avevo visti (il dizionario, però, non mi era venuto in mente) ma ho visto anche (nel codice di platform) riferimento a numerose distribuzioni di linuc (debian, slack, etc..), una disanima di windos con versioni, sub-versioni e service pack, non mi ci sono impelagato perché già tendo a distrarmi e perdere tempo, che ora non ho.

Finita la sigaretta si riprende a trottare.

Grazie ancora per l'indicazione, ciao :)

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #5 il: Febbraio 03, 2020, 11:24 »
Mah sai non è che ci sia tanto da sudare...

Dato che oggi ho avuto la possibilità di smanettare un po' sul computer di un collega assente, riprendo il discorso, in primo luogo le key del dizionario definente il launcher : pur dando abbastanza per scontato che fossero "giuste" ho voluto verificarle, e lo sono, tutte le mie distro (lavoro e casa) danno "linux" come platform, tre su tre prove su macchine windows (7, 8 e 10) danno "win32", anche nel caso di windows 10 a 64 bit ... dal punto di vista delle "necessità", cade dunque il mio timore di diversa risposta.

Materia diversa è "subproces" con windows, in tutti i vari tentativi di utilizzo ha dato errore relativo al file : non lo trova.

Mi son guardato tutte le varie fasi di definizione del file, rilevando che alcuni tipi di operazioni, tipo "os.path.join" hanno un risultato che mischia i separatori windows "\" con quelli unix "/" cosa che, comunque, non sembra avere effetto nelle operazioni con python ed in ogni caso svanisce applicando un "os.path.abspath" sul file che da in risposta un percorso in notazione windowssiana. L'accorgimento non ha comunque effetto sull'operazione con subprocess.
Per altro, sono andato a trovarmi la docs windows per "start", composto manualmente l'istruzione secondo i canoni letti, tentato varie "vie" alternative, l'esito è stato comunque quello, mentre l'istruzione "os.system" funziona e apre i file.

Va da se che probabilmente mi sia necessario tanto approfondire le mie conoscenze su subprocess quanto testarle adeguatamente su sistemi windows, intanto mi devo limitare ad usare "*solo* per windows" os.system, anche se deprecata risolve lo scopo del momento, più in la spero di poter approfondire.

Ciao :)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #6 il: Febbraio 03, 2020, 15:55 »
colpa mia... per fare in fretta ho detto "start" e basta ma ovviamente "start" è un comando di shell... e dimentico che tu non sei pratico di windows...
Quindi sarebbe subprocess.run(['cmd', '/c', 'start', miofile]), e quindi, tecnicamente, l'esempietto che ho fatto sopra potrebbe diventare qualcosa come:

def viewfile(f):
    try:
        launcher = {'linux':['xdg-open'],
                    'win32':['cmd', '/c', 'start'],
                    'darwin':['start']}[sys.platform]
    except KeyError:
        return
    launcher.append(f)
    subprocess.run(launcher)

o qualcosa del genere

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Aprire documenti con applicazione grafica predefinita nel sistema
« Risposta #7 il: Febbraio 04, 2020, 08:35 »
colpa mia... per fare in fretta ho detto ...

La mia ignoranza non può certamente esserTi attribuita quale "colpa", è abbastanza comune dare per scontato ciò che si ritiene banale, capita spesso anche a me :)

Ti ringrazio per le indicazioni date e gli esempi di codice che mi fanno toccare con mano anche nelle cose spicciole una "eleganza" cui potrei arrivare ma che non mi è spontanea.

Riguardo alla definizione del comando in windows funziona bene, avevo immaginato che ci fosse una qualche concatenazione di comandi/opzioni che non conoscevo (è frequente anche negli script cui sono abituato) ma tali smanettamenti in windows sono per il futuro, forse.

Considero risolto l'argomento, grazie ancora :)