"Uploader" un code depuis la carte

Dans diverses situations, on peut avoir besion de faire une copie d'un code présent sur la carte sur le poste principal, ce que j'appelle uploader un code.

Ici, petit point sur les différentes possibilités.

Avec pyboard

Pyboard, le couteau suisse de la gestion de la carte Micropython permet de le faire.

Déjà première, chose, pour mémoire, on peut lister les fichiers présents sur la carte en faisant :

python3 pyboard.py --device /dev/ttyUSB0 -f ls :

Ensuite, pour copier un fichier de la carte dans le répertoire courant de l'ordinateur, on fera :

python3 pyboard.py --device /dev/ttyUSB0 -f cp :boot.py boot.py

Le fichier est ensuite disponible sur l'ordinateur.

A partir d'un code Pythoon

Commencer par lancer une interpréteur Python dans le répertoire où on souhaite copier le fichier en provenance de la carte. . Par exemple Jupyter en faisant :

jupyter-qtconsole

Il est possible de faire la même chose en exécutant la ligne de commande correspondante depuis un code Python sur l'ordinateur en faisant :

import subprocess
cmd=['python3','./pyboard.py', '--device', '/dev/ttyUSB0' , '-f', 'cp', ':boot.py', 'boot.py'] # '--no-follow']
subprocess.run(cmd)
Out[36]: CompletedProcess(args=['python3', './pyboard.py', '--device', '/dev/ttyUSB0', '-f', 'cp', ':boot.py', 'boot.py'], returncode=0)

Note

Si on a un problème, tester la commande depuis le terminal pour être sûr qu'elle s'exécute bien. La commande ne fonctionnera pas si le REPL est utilisé par un autre programme (Thonny, etc. ) qu'il faudra fermer le cas échéant.

Si la commande s'exécute correctement, elle renvoie le code 0.

En mode REPL depuis un code python

Commencer par lancer une interpréteur Python dans le répertoire où on souhaite copier le fichier en provenance de la carte. . Par exemple Jupyter en faisant :

jupyter-qtconsole

Si on a besoin de faire la manip' à partir d'un code Python en mode REPL, on pourra faire :

import pyboard

pyb=pyboard.Pyboard('/dev/ttyUSB0', 115200)

pyb.enter_raw_repl()

# chargement d'un code présent sur la carte micropython
ret=pyb.exec("""f=open("boot.py","r")
c=f.read()
f.close()
print(c)
""")

print(ret)
b'# This file is executed on every boot (including wake-boot from deepsleep)\r\n#import esp\r\n#esp.osdebug(None)\r\n#import webrepl\r\n#webrepl.start()\r\nprint("boot.py")\r\n\r\n'

f=open("boot.py","w")
f.write(ret.decode()) # ret est au format bytes
Out[14]: 164
f.close()

# verification
f=open("boot.py","r")
c=f.read()
f.close()

print(c)

Ce qui donne :

# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
print("boot.py")