Profilo di nuzzopippo

Nome nuzzopippo
Indirizzo email nuzzopippo@gmail.com
AvatarAvatar utenti
Messaggi211
Firma forum
Fatti non foste a viver come bruti...
  • Re: Chiarimento sull'uso del metodo "subprocess.Popen".
    Forum >> Programmazione Python >> Scripting
    Aggiornamento:




    A giudicare da quanto letto, partendo da questa pagina, mi son convinto che "adb" esegua un comando alla volta e poi ritorni immediatamente, no vi dovrebbe essere una shell disponibile, quindi la modalità "interattiva" richiesta dallo OP non vale la pena di essere perseguita (ci risparmiamo un po' di thread per lettura/scrittura e relativa queue).

    Il mio dispositivo di test dispone di Android 5.0, quindi va a farsi benedire l'accesso in rete riportato nel link, può essere utilizzato solo su usb, approfittando del fatto che deve essere l'unico dispositivo connesso con tale modalità (adb darebbe errore altrimenti), ho verificato che è possibile tranquillamente navigare il file-system del cellulare e copiarsi dei files li depositati, vedere sessione sotto (ridotta per quanto possibile)

    Python 3.12.3 (main, Nov  6 2024, 18:32:19) [GCC 13.2.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    import subprocess as sp
    result = sp.check_output(['adb', 'devices', '-l'])
    result
    b'List of devices attached\n0123456789ABCDEF       device usb:3-8 product:V10_open_eu model:LG X150 device:v10 transport_id:1\n\n'
    result = sp.check_output(['adb', 'shell', 'ls', '-l', '/'])
    text = result.decode()
    data = text.split('\r\n')
    for r in data:
        print(r)
    
        
    drwxr-xr-x root     root              2010-01-01 01:47 acct
    drwxrwx--- system   cache             2010-01-01 01:07 cache
    lrwxrwxrwx root     root              1970-01-01 01:00 charger -> /sbin/healthd
    dr-x------ root     root              2010-01-01 01:47 config
    ...
    -rw-r--r-- root     root        30298 1970-01-01 01:00 file_contexts
    lstat '//flex' failed: Permission denied
    -rw-r----- root     root         1712 1970-01-01 01:00 fstab.mt6582
    ...
    -rw-r--r-- root     root        11264 1970-01-01 01:00 service_contexts
    drwxr-x--x root     sdcard_r          2010-01-01 01:47 storage
    dr-xr-xr-x root     root              2010-01-01 01:47 sys
    drwxr-xr-x root     root              1970-01-01 01:00 system
    ...
    result = sp.check_output(['adb', 'shell', 'ls', '-l', '/storage'])
    text = result.decode()
    data = text.split('\r\n')
    for r in data:
        print(r)
    
        
    drwxr-xr-x media_rw media_rw          2010-01-01 01:47 emulated
    lrwxrwxrwx root     root              2010-01-01 01:47 sdcard0 -> /storage/emulated/legacy
    drwxrwx--x root     sdcard_r          1970-01-01 01:00 sdcard1
    drwx------ root     root              2010-01-01 01:47 usbotg
    
    result = sp.check_output(['adb', 'shell', 'ls', '-l', '/storage/sdcard1'])
    text = result.decode()
    data = text.split('\r\n')
    for r in data:
        print(r)
    
        
    drwxrwx--x root     sdcard_r          2014-02-03 08:40 Android
    drwxrwx--- root     sdcard_r          2014-02-03 08:38 DCIM
    drwxrwx--- root     sdcard_r          2014-02-03 08:32 LOST.DIR
    drwxrwx--- root     sdcard_r          2016-06-25 12:03 Recording
    drwxrwx--- root     sdcard_r          2015-10-25 15:05 bluetooth
    drwxrwx--- root     sdcard_r          2020-10-06 17:54 documents
    drwxrwx--- root     sdcard_r          2021-05-30 06:32 download
    drwxrwx--- root     sdcard_r          2014-02-03 08:32 foursquare
    drwxrwx--- root     sdcard_r          2014-06-03 07:49 musica
    drwxrwx--- root     sdcard_r          2018-07-30 12:12 video
    
    result = sp.check_output(['adb', 'shell', 'ls', '-l', '/storage/sdcard1/documents'])
    text = result.decode()
    data = text.split('\r\n')
    for r in data:
        print(r)
    
        
    -rwxrwx--- root     sdcard_r  2029923 2016-06-25 22:31 BREAKING DAWN.pdf
    -rwxrwx--- root     sdcard_r  1586880 2016-06-25 19:32 ECLIPSE.pdf
    -rwxrwx--- root     sdcard_r  1384907 2016-06-25 20:32 NEW MOON.pdf
    drwxrwx--- root     sdcard_r          2015-08-15 19:10 Sample Files
    -rwxrwx--- root     sdcard_r   624276 2016-06-25 20:33 Stephenie Meyer - MIDNIGHT SUN (cap 1-12)_italiano.pdf
    -rwxrwx--- root     sdcard_r  1282329 2016-06-25 20:33 Twilight.pdf
    
    
    result = sp.check_output(['adb', 'pull', '/storage/sdcard1/documents/ECLIPSE.pdf', '/home/ngiuseppe'])
    result
    b'/storage/sdcard1/documents/ECLIPSE.pdf: 1 file pulled, 0 skipped. 4.4 MB/s (1586880 bytes in 0.345s)\n'
    ho voluto mostrare come son proceduto nella navigazione ed il risultato della copia da cellulare a computer, modalità analoghe dovrebbero funzionare per fare l'inverso.




    Spero possa essere utile.

    Ciao

    Fatti non foste a viver come bruti...
  • Re: Chiarimento sull'uso del metodo "subprocess.Popen".
    Forum >> Programmazione Python >> Scripting
    Come detto, il mondo Android mi è sconosciuto, cercando in merito ad "adb" ho scoperto che esiste anche per il mondo linux, scusa se inserisco un tip per eventuali linux-users interessati :

    può essere installato dal Vostro gestore di pacchetti, in distro debian-based:

    NzP:~$ sudo apt install adb
    
    Si tratta dello Android-SDK di google.

    Il comando "adb" che avrete disponibile è, essenzialmente, un server, capace di rilevare dispositivi in rete, udb/seriale, etc. il solito "man adb" per le numerose opzioni disponibili.




    Se il dispositivo "collegato" non avrà abilitata tra le opzioni dello sviluppatore la modalità "debug USB" esso NON sarà disponibile anche se collegato.




    Venendo a python, cercando di muovere i primi passi utilizzando la metodica proposta dallo O.P., utilizzando un vecchio "LG Bello II" molto vecchio, mi è riuscito di vedere il device in questo modo :

    import subproces
    result = subprocess.check_output(['adb', 'devices'])
                              
    result
    b'List of devices attached\n0123456789ABCDEF\tunauthorized\n\n'
    data = result.decode('utf-8')
    data
    'List of devices attached\n0123456789ABCDEF\tunauthorized\n\n'
    device = data.split('\n')1.split('\t')
    print(f'device {device0} - stato {device1}')
    device 0123456789ABCDEF - stato unauthorized
    mi è riuscito di avere gli stessi risultati tramite Popen, ma senza utilizzo della shell

    adb_sh = subprocess.Popen(['adb', 'devices'],
                              stdin=subprocess.PIPE,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
    out, err = adb_sh.communicate()
    out
    b'List of devices attached\n0123456789ABCDEF\tunauthorized\n\n'
    dato che l'utilizzo della shell scatena una miriade di output, attivando, se ho capito bene, il server

    adb_sh = subprocess.Popen(['adb', 'devices'],
                              shell=True,
                              stdin=subprocess.PIPE,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
    out, err = adb_sh.communicate()
    out
    b'Android Debug Bridge version 1.0.41\nVersion 34.0.4-debian\nInstalled as
     /usr/lib/android-sdk/platform-tools/adb\nRunning on Linux 6.8.0-50-generic...
    rendendo ingestibile l'output.

    Non ho ancora ben capito come funziona la shell con adb, l'impressione è che venga chiusa appena eseguito un comando, al momento non ho motivo di pensare che rimanga disponibile un PID, mi riservo di approfondire.




    @FaMel 79, Tu sei riuscito a vedere i Tuoi devices? Se la risposta è "NO" prova a sostituire al mio "adb" il pathmane del Tuo eseguibile, oltre, naturalmente, a verificare le impostazioni del Tuo device.

    per inviare i comandi si dovrebbe utilizzare "communicate" inviando i comandi come byte (stringa.encode()) e sopra vi è esempio di come recuperare lo standard output e lo standard error.




    Al momento è quello che posso, spero Ti sia utile, ciao

    Fatti non foste a viver come bruti...
  • Re: Chiarimento sull'uso del metodo "subprocess.Popen".
    Forum >> Programmazione Python >> Scripting
    sono un nuovo utente del forum alla ricerca di qualche consiglio... Avrei bisogno di qualche chiarimento su come utilizzare il metodo "subprocess.Popen" per gestire l'eseguibile "adb.exe" durante le operazioni di I/O su smartphone Android. Di seguito condivido lo script realizzato e l'output ottenuto.
    Scusa se intervengo solo per porre una domanda, non ho alcuna pratica di interfacciamento con sistemi android ma il quesito mi ha incuriosito.

    Domanda : le operazioni di I/O che stai cercando di effettuare sono da un sistema operativo "altro" (tipo windows, linux, etc.) verso un dispositivo android collegato, ovvero direttamente in una applicazione funzionante in un dispositivo android?




    Chiarendo tale "ambiguità" scaturiscono linee di ricerca diverse, con risultati, nel primo caso, anche direttamente collegati al quesito, tipo questo, od anche inerenti tools specifici, tipo questo, mentre nel secondo, a giudicare da questo, sembra una problematica tutt'altro che semplice.




    Come detto, la Tua domanda mi ha incuriosito, "abd.exe" mi è sconosciuto (uso solo sistemi linux) ma se precisi cosa intendi fare e come si potrebbe cercare qualcosa di specifico al Tuo problema.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Individuare files dei fonts
    Forum >> Programmazione Python >> Files e Directory
    Ciao Nuzzopioppo, sempre una fonte di approfondimento. Per fortuna che tu sei quello che in una mailing LIST potrebbe essere di “impaccio” …… pensa a chi sta peggio di te che rompi che sarebbe.

    Saluti ancora e grazie per tutte le info che ci dai

    Oh ... mi fa piacere il Tuo apprezzare, grazie, ma in ogni caso approfondì la problematica, sviluppando tutta una serie di metodi per ricerca e visualizzazione, ma non la risolsi.




    Se sei interessato il discorso può anche essere ripreso, comunque la "sensazione" è quella che si finisce in un far west, ove ognuno usa "regole proprie"

    Fatti non foste a viver come bruti...
  • Re: Apertura menu laterale
    Forum >> Principianti
    ... Ti consiglio di esplorare anche l'uso di place per gestire la Among Us posizione del frame...
    beh ... fermo restando che vale comunque la pena di conoscere tutti i gestori di geometria disponibili, l'utilizzo di "place" implica il ricalcolo del posizionamento di ogni singolo widget contenuto in una finestra che lo adotta.

    A mio parere, sfruttare le caratteristiche di "elasticità" dei gestori "pack" o "grid" semplifica parecchio la faccenda e riduce di molto il codice necessario (il che è sempre un'ottima cosa), un buon "disegno" preventivo dell'interfaccia e degli "effetti" che si vogliono ottenere sarebbe un buon approccio, poi scegliere il gestore secondo il criterio del minimo codice possibile : semplificherebbe la manutenzione del codice stesso e l'introduzione di bugs nella stesura imho




    Ciao :)

    Fatti non foste a viver come bruti...
  • Re: Messaggi privati nel forum?
    Forum >> Principianti
    non saprei risponderti, ma nel mio c'è il criptico messaggio allegato, quindi forse palmux sa come si fa :P
    Quindi funziona ... Credo che il "come" lo si possa "decifrare", non che sia poi significativo la mia era solo curiosità, se sei curioso anche Tu potrei provare ad inviarTi un messaggio di prova, magari ci riesco :D




    edit : vedo che sono stato preceduto, ok, funziona, ed ho capito l'indicazione che vedevo : totale dei messaggi scambiati




    Curiosità soddisfatta, non ne abuserò, Grazie e ciao :)



    --- Ultima modifica di nuzzopippo in data 2024-12-06 13:10:56 ---
    Fatti non foste a viver come bruti...
  • Messaggi privati nel forum?
    Forum >> Principianti
    Salve, non sapevo dove porre la domanda, provo qui.



    Quando effettuo il login trovo una cartella non visibile in caso di navigazione anonima, essa è denominata "Messaggi privati" con sottotitolo "i tuoi messaggi privati", segna 9 "discussioni" ma accedendovi non ne risulta alcuna.

    Me ne sono accorto di recente, di norma effettuo il login giusto per rispondere ad un post e mi disconnetto immediatamente.

    Anche se suppongo che sia un abbozzo di qualcosa poi tralasciato mi ha incuriosito e potrebbe esserci qualcosa che non conosco, domande :




    1 - Funziona la messaggistica inter-utente?

    2 - se si, come?




    Grazie dell'attenzione
    Fatti non foste a viver come bruti...
  • Re: [tkinter] drag and drop, ne parliamo?
    Forum >> Programmazione Python >> GUI
    Daniele aka Palmux said @ 2024-12-05 12:20:28:
    Comunque ripeto, un gran bel lavoro, bravo.
    Grazie del complimento, me ne sento lusingato, cercherò di rispondere alle domande




    Allora :

    A. Perché hai scelto di utilizzare una classe astratta per il supporto al drag and drop, per esempio non poteva essere migliore l'utilizzo di mixin?
    Ho scelto di utilizzare una classe astratta perché il codice di visualizzazione del "drag" è comune a tutte le possibili implementazioni, ciò che cambia sono i metodi di rilascio e ricezione dei dati, per i quali è reso necessario definire i metodi astratti, rispettivamente, "drag_data" e "drop_data" nelle classi reali.

    Tal genere di processi mi è facile pianificarli, li conosco e credo che tale mezzo sia utile per far evitare (anche allo scrivente) nei limiti del possibile "mutazioni" di codifica incompatibili tra loro




    ... le astrazioni sono migliori di "mixin"? Purtroppo al momento non saprei dirlo, è un (anti?)pattern da me ancora non affrontato, posto anche per imparare cose nuove, e credo proprio lo esperimenterò (si tratta di sub-classare più classi contemporaneamente, ho capito giusto?


    Comunque, come certo hai già rilevato e che preciso per altri lettori, ho adottato una metodologia diametralmente opposta, i widget tkinter non incapsulano assolutamente nulla delle classi reali che effettuano il drag&drop ma sono le istanze a queste ultime che incapsulano i widget, dei quali sfruttano le caratteristiche per funzionare e modificano a loro uso, eventualmente richiedendo possiedano, anche indirettamente, un qualche metodo specifico per il rilascio/acquisizione dei dati, un esempio in tal senso è la classe "DADComuni", di "test.py" che richiede all'oggetto trasmittente i dati il metodo "get_element()" ed all'oggetto ricevente il metodo "set_comune(data)" (forse un po' troppo specifico) ... questo porta alla seconda domanda :

    B. Come garantisci che i dati trascinati e rilasciati siano validi rispetto al tipo specificato?"
    è la variabile di istanza "tipe", definita nella classe astratta originale a controllare il tutto, tale controllo è, ovviamente, demandato alla implementazione reale della classe ed è il recettore dei dati che dovrò effettuare il controllo, nella classe DADComuni


        def drop_data(self, descriptor, data: any) -> None:
            if not self._dropable: return
            if descriptor != self.tipe: return
            self.obj.set_comune(data)
    
    
    Ove il "descriptor" proviene direttamente dalla classe madre, di cui la classe incapsulante un widget origine dei dati è implementazione reale, al rilascio del pulsante del mouse gestito dall'oggetto origine dei dati, che richiama i dati invocando "self.drag_data()" e rilasciandoli alla controparte invocando la proprietà "obj.drop_data(self.tipe, data)" ricevuta quando è stato incapsulato.

    Il "tipe" delle due istanze della classe reale per origine/ricezione devono essere uguali o il passaggio verrà interrotto ... ovviamente, a tipi uguali corrisponde una stessa tipologia di dati (un dizionario con chiavi conosciute nel caso), non dimentichiamo che parliamo di una stessa applicazione ... i dati possono essere qualsiasi cosa serva, "tipe" può essere definito a piacere in sede di istanza.




    Ho pensato che una tecnica si fatta sia abbastanza semplice ed elastica per essere adottata in numerosi casi, comunque sono pronto ad imparare come far meglio ;)




    Ciao e grazie




    Fatti non foste a viver come bruti...
  • Re: [tkinter] drag and drop, ne parliamo?
    Forum >> Programmazione Python >> GUI
    Dopo aver, credo, compreso ciò che mi lasciava perplesso (e datomi dell'asino) ho ri-adeguato l'implementazione, che ritengo ora corretta, i test effettuati sembrano funzionare bene.

    Quanto implementato permette di effettuare il drag & drop di oggetti a piacere tra finestre tkinter di una stessa applicazione, accoppiando widget sorgenti e destinatari per tipologia.

    I widget vengono incapsulati in implementazioni reali della classe astratta "DragDropElement" e ricevono da essa quattro nuove proprietà che puntano a metodi di istanza che definiscono le capacità di invio/ricezione dati in gioco.




    Date le 363 visualizzazioni avute dal post, allego, nel caso possa essere utile a qualcuno, i files di codifica della classe e test usati, vi troverete esempi d'uso della tecnica, per operare avrete bisogno anche del file json allegato in precedente post, il tutto presente nella stessa directory.




    Ritengo adeguatamente conclusa la problematica in oggetto, comunque, se qualcuno riterrà di porle, sarà cosa gradita discutere su osservazioni/domande in merito.




    Grazie dell'attenzione :)

    Fatti non foste a viver come bruti...
  • Re: [tkinter] drag and drop, ne parliamo?
    Forum >> Programmazione Python >> GUI
    Daniele aka Palmux said @ 2024-11-20 13:49:05:
    Lo farò sicuramente, non avere fretta perché ho un "milionaio" di attività da fare, ma una promessa è un debito.
    Ti ringrazio per la Tua disponibilità, prendi tranquillamente tutto il tempo che Ti serve

    ... comunque, ho il sospetto che il problema derivi dai decoratori "@property" e "@<metodo>.setter" utilizzati nella classe definente l'elemento "drag-drop", apparentemente non vengono ereditati correttamente.
    Infatti, implementando specifici metodi getter e setter (tipo set_dragable(self, variabile) e get_dragable(self)) le variabili di classe self._dragable e self._dropable vengono variate (prima non avveniva) e si ha conformità nelle valutazioni tra classe ed oggetto.

    Approfondirò, intanto grazie del Tuo interessamento.

    Edit: bah ... forse non pongo domande "giuste" nelle mie ricerche, ma non ho trovato informazioni direttamente associate al caso specifico, però ho trovato più volte indicato che "l'incapsulazione delle classi non è completa in python", penso che la problematica da me riscontrata possa ricadere in tale ambito.

    In effetti, utilizzando i decoratori built-in prima indicati non faccio altro che incapsulare dei metodi di classe in funzioni, forse è possibile che l'ulteriore incapsulamento che avviene utilizzando l'ereditarietà non arrivi a definire tale circostanza.

    Comunque, evitando i decoratori ed utilizzando metodi diretti per l'impostazione delle proprietà _dragable e _dropable, la funzionalità dello insieme tornano nei criteri da me conosciuti.

    Pur se esistono varianti possibili da studiarsi (non ultima la definizione di classi-decoratore per i widget) credo che la metodologia a "metodo diretto" raggiunga un sufficiente compromesso tra semplicità ed elasticità, permettendo di svolgere l'intero lavoro (a parte i metodi astratti) all'interno della classe-madre ...


    Ri-Edit : e, pensandoci un po' e facendo qualche prova

    class A:
        def __init__(self, obj):
            self.obj = obj
            self._dragable = True
            self._dropable = True
            self.obj.dragable = self.dragable
    
        @property
        def dragable(self):
            return self._dragable
        
        @dragable.setter
        def dragable(self, value):
            self._dragable = value
    
    class B:
        def __init__(self):
            self.name = 'Prova'
    
    ogg = B()
    ogg.__dict__
    {'name': 'Prova'}
    toclass = A(ogg)
    ogg.__dict__
    {'name': 'Prova', 'dragable': True}
    toclass.__dict__
    {'obj': <__main__.B object at 0x7a3b07f63710>, '_dragable': True, '_dropable': True}
    ogg.dragable = False
    ogg.__dict__
    {'name': 'Prova', 'dragable': False}
    toclass.__dict__
    {'obj': <__main__.B object at 0x7a3b07f63710>, '_dragable': True, '_dropable': True}
    type(toclass.dragable)
    <class 'bool'>
    type(ogg.dragable)
    <class 'bool'>
    
    mi sovviene che l'eredità centra ben poco ma entra in gioco una decisa ambiguità nella istruzione


    self.obj.dragable = self.dragable


    la quale, ovviamente, va ad assegnare a obj il "valore" restituito dalla dal metodo con decoratore "@property", definendo per esso una nuova proprietà di tipo booleano, il setter non entra mai in gioco.




    ... mi son sentito un po' stupido, capendolo, il problema, tanto per cambiare ero io :angry:



    --- Ultima modifica di nuzzopippo in data 2024-11-25 09:53:05 ---
    Fatti non foste a viver come bruti...