Italian NinjaPython in B4A

Marco Gioia

Member
Licensed User
Ciao a tutti,

qualcuno sa come si inserisce la libreria urllib.request e come si legge la stringa mystr?

Dim py As NinjaPython
dim pys as string

pys = "import urllib.request"
pys = pys & "fp = urllib.request.urlopen('https://www.miosito.it')"
pys = pys & "mybytes = fp.read()"
pys = pys & "mystr = mybytes.decode('utf8')"
pys = pys & "fp.close()"

Grazie
 

LucaMs

Expert
Licensed User
Longtime User
L'autore (@wonder) spiega:
1588532250274.png


Quindi:
- dovrai compilare il tuo progetto B4A in modalità Release (non in Debug), dopo aver fatto quanto segue, ovviamente
- scaricare il file zip che contiene i due file da mettere nella cartella delle librerie aggiuntive di B4A - il file zip si chiama NinjaPython 1.03.zip, i file che contiene, da spostare, sono NinjaPython.jar e NinjaPython.xml
- poi scegli se scaricare i file di risorse (sempre un file zip da decomprimere) e metterli nella cartella del tuo progetto B4A (quella che contiene appunto il tuo xxx.b4a) oppure scaricare il suo progetto B4A di esempio, che immagino contenga già questi file, situati nel posto giusto (ti consiglierei di fare questa seconda cosa e poi modificare il suo progetto come serve a te).

Infine, non devi importare la libreria nel modo in cui hai scritto, ma soltanto selezionarla nel tab Libraries, a destra nell'IDE.
 

Marco Gioia

Member
Licensed User
Ciao LucaMs,
in effetti da quello che ho scritto non si capisce niente :)
Ci riprovo
Ho già un progetto di esempio (somma 2 numeri eh eh) che funziona con NinjaPython (anche in debug) ma non riesco a capire come inserire la libreria urllib.request
(che mi serve per leggere pagine html) e come leggere la variabile mystr in B4A
 

LucaMs

Expert
Licensed User
Longtime User
ok la urllib.request è piu' complicato.. sai come "passare" la variabile mystr da python a b4a?
Se devi passare solo il valore della variabile, mi sembra scontato che tu debba costruire il comando Python (la stringa) da passare al metodo Execute.
Nel suo progetto d'esempio, lui ha:
B4X:
Dim example = "print 'Hello, world!'" As String
che poi in pratica (non proprio direttamente così) esegue con:
B4X:
py.Execute(example)

A te basterebbe, per usare il contenuto della variabile B4A:
B4X:
Dim example As String   
Dim MiaVar As Int = 123
example = $"print '${MiaVar}'"$
Py.Execute(example)
 

LucaMs

Expert
Licensed User
Longtime User
Tutto quello che posso fare è "esaminare" i membri della sua libreria:

1588538090331.png


per passare da b4a a python ok, ma per tornare da python?
Non credo si possa fare; penso che tu possa solo eseguire codice Python all'interno dell'app, senza altre interazioni tra B4A e questo codice, se non quello che ti ho suggerito.

Puoi provare a chiedere direttamente a @wonder, in quel thread, ma temo con poca speranza.
 

Marco Gioia

Member
Licensed User
Ho scritto a Wonder (l'ultima volta che è entrato è il 5 marzo 2020)
Cmq lui nel suo thread dice:

- Passing and returning B4A objects such as lists and maps


Passing non è un problema, returning si
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ma quando il tuo codice B4A fa eseguire a Phyton il comando "print", dove va a finire l'output ?
Cioè se fai
B4X:
print "hello world"
dove poi la vedi la scritta "hello world" ??

Edit:
da quello che ho potuto vedere il metodo Execute ritorna una stringa, che quindi secondo me puoi leggere tranquillamente ed avere il tuo bel risultato, probabilmente sarà proprio la scritta "hello world"

Devi quindi fare in modo che il tuo programma in Phyton ritorni solamente stringhe.
Se hai altri tipi di oggetti che vuoi ritornare, devi prima trovare il modo di trasformarli in formato JSON (o altro) e poi una volta ricevuto in B4A lo ritrasformi in un oggetto

Edit 2:
urllib.request.urlopen('https://www.miosito.it')
per fare questa cosa non ti serve Phyton, puoi farglielo fare a B4A
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
in effetti da quello che ho scritto non si capisce niente :)

Direi proprio di si, ho dovuto leggermi due volte tutto il thread per capire la domanda che facevi :p

non riesco a capire come inserire la libreria urllib.request

non si può, la libreria funziona solo con le Python Standard Library

(che mi serve per leggere pagine html)
puoi leggerle tramite B4A, non serve farlo tramite Phyton

e come leggere la variabile mystr in B4A

nel codice Phyton ci metti
B4X:
print mystr
e te lo ritrovi come risultato del metodo Execute
 

Marco Gioia

Member
Licensed User
ottimo!
Funziona... alla print (come ritorno) non ci avevo proprio pensato
Per quanto riguarda la urllib.request sto studiando una soluzione per inserire la libreria nello zip
(si lo so che si può fare la stessa cosa in B4A ma se riesco ad inserire questa libreria non standard riesco ad inserire qualsiasi altra libreria)

1588589375617.png


Grazie
 

Star-Dust

Expert
Licensed User
Longtime User
io sconsiglierei perché lo sviluppatore ha lasciato il progetto
 
Top