jeudi 4 août 2016

Python: faire un breakpoint en mode interactif pour faire du débogage

Dans les IDE évolués nous disposons généralement d'une fonctionnalité "Breakpoint" pour arrêter le programme et pouvoir inspecter le contenu des variables locales.
Il est possible de réaliser quelque-chose de similaire en mode console (python interactif) qui fonctionne aussi bien sous Windows que sous Linux. Très utile si l'on se trouve sur un environnement sans facilité.

Je bosse sur un projet TkInter et j'aurais trouvé intéressant de pouvoir inspecter le contenu d'un événement en mode interactif... bref, sauter dans un débogueur mais "sans débogueur" à disposition.

J'ai trouvé ce petit bout de code qui fonctionne à merveille et qui lance un python interactif là où j'en ai besoin.
La réponse se trouve dans code.interact()
 
>>> import code
>>> def foo():
...   a = 10
...   code.interact(local=locals())
...   return a
...
>>> foo()
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10

  • Presser Ctrl+Z pour terminer la session interactive. 
  • Il n'est pas possible de modifier les variables locales (cela n'a pas d'implication sur le code appelant). 
  • Vous pouvez lister inspecter les variables locales en utilisant dir() 
Voici un autre exemple tel qu'utilisé depuis un code tkInter.
N'oubliez pas de démarrez votre programme avec python.exe et non pythonw.exe pour disposer d'une console ;-)

import code
...
...
def focus_next_window(event):
    """ Move focus to next item, Bind it for  """
    print( type(event.widget) )
    code.interact(local=locals())
    event.widget.tk_focusNext().focus()
    return("break")

Souce: http://stackoverflow.com/questions/13432717/enter-interactive-mode-in-python

mardi 26 juillet 2016

Utiliser Curses avec Python sous Windows

Curse pour créer une interface console
J'ai déjà touché un peu à Curse avec python sous Linux.
Je trouvais cette bibliothèque d'interface rudimentaire mais suffisante pour réaliser des applications en mode console (ce que nous avons déjà avec de vielle applications clipper qu'il faudra un jour ré-écrire).
Le Hic c'est qu'il n'existait pas de portage Python's curses sous Windows... jusqu'à assez récemment.

Donc, curses sous Python était uniquement cantonné au machine Linux... mais maintenant accessible sous Windows

Des binaires non-officiel pour Python sous Windows
En grattant une nouvelle fois sur le Net, j'ai trouvé
Où il propose justement des packages curses pour Windows.

Curses, an extension based on the PDCurses library.
Unicode characters are not supported.
Comme j'utilise Python 3.4 sous Windows 7, j'ai opté pour le téléchargement du fichier "curses-2.2-cp34-none-win32.whl" (cp34 signifie CPython 3.4... donc le compilateur officiel de la fondation).

whl est un fichier wheel (pythonwheels.com) est le nouveau standard de distribution des bibliothèque python qui remplacera à terme les fichiers .egg

Vous pouvez installer un fichier whl avec votre utilitaire pip.
Dans mon cas, j'ai utilisé la signe de commande suivante sous Windows:
c:\Users\Stock\Downloads>pip3 install curses-2.2-cp34-none-win32.whl
Processing c:\users\stock\downloads\curses-2.2-cp34-none-win32.whl
Installing collected packages: curses
Successfully installed curses-2.2

Et j'ai pu utiliser du code curses suivant sous Windows

from curses import wrapper

def main(stdscr):
    # Clear screen
    stdscr.clear()

    for i in range(0, 10):
        v = i-10
        stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))

    stdscr.refresh()
    stdscr.getkey()

wrapper(main)


Une chouette avancée pour le portage des applications d'une plateforme à l'autre... à voir si cela tient vraiment ses promesses.

Basé sur PDCurses
Le bibliothèque curse installée (celle mentionnée ci-avant) est basé sur PDCurses.
http://www.projectpluto.com/win32a.htm


Support des accentués sous Windows
Je me suis littéralement cassé les dents dès l'impression du premier texte contenant des accentués.
Voyez ce billet sur IndexError (http://indexerror.net/4170/python-3-4-curses-sous-windows-7-erreur-dencodage).
L'utilisation de différents code pages dans le système d'exploitation (voir le billet) ne simplifie rien... et même en passant ma console en cp1252 (comme supporté par curse puisque la doc mentionne qu'il utilise du local.preferredencoding() - soit cp1252 -  pour l'encodage des chaine unicode)... curse détruit toujours l'affichage de mes accentués.



Au détour de différentes lectures (a confirmer), j'ai appris que cette bibliothèque curses utilise PDCurses s'appuie elle-même sur la SDL. La SDL qui, elle, n'intègre le support Unicode que depuis peu. C'est peut être normal que cela cafouille un peu.... et c'est franchement regrettable.

dimanche 10 juillet 2016

Faire une mise-à-jour de Linux Mint en ligne de commande

Bonjour à tous,

J'ai trouvé un chouette article (en Français) pour faire une mise-à-jour (distribution upgrade) d'un Linux Mint.

http://www.linuxtricks.fr/wiki/mettre-a-niveau-linux-mint-vers-une-nouvelle-version

Très utile
  • http://www.linuxtricks.fr/wiki/mettre-a-niveau-linux-mint-vers-une-nouvelle-version

mercredi 8 juin 2016

Monter un lecteur reseau sous Linux - Samba share

Si vous cherchez à monter une "lecteur réseau" sous Linux (Linux Mint dans mon cas, donc Ubuntu), il va falloir redescendre dans les montage Samba CIFS.
Mon dieux que cela faisait longtemps.... terriblement longtemps

Voici une référence d'article qui vous aidera indéniablement:
Pour le moment, j'en suis à faire un montage avec la commande mount avant de le rendre permanent dans /etc/fstab

Pour commencer, il faut créer un point de montage, dans /mnt puisqu'il s'agit d'un lecteur présent en permanence (pas comme une carte sd qui, elle, doit être montée dans /media .

sudo mkdir /mnt/netstock

En ligne de commande, cela ressemble à ceci

sudo mount -t cifs -o user=share_username,uid=local_user_owning_files  //192.168.1.2xx/netstock /mnt/netstock

Une fois la commande saisie, il vous sera demandé le mot de passe du lecteur réseau (celui correspondant à user=) pour faire le montage

Les paramètres:
  • share_username : c'est le nom d'utilisateur windows a utiliser pour connecter le lecteur réseau
  • local_user_owning_files : si ce paramètre est omis, les fichiers du share seront vu comme appartenant à root. Perso, je préfère qu'il soient détenu par l'utilisateur courant (utilisez votre login Linux pour ce paramètre)
Selon la doc, il est possible d'ajouter un paramètre "password=" mais je n'ai encore aboutit a rien avec celui-ci... la raison voudrais qu'il ne soit pas possible de saisir un mot de passe en clair dans un script ;-)

FSTAB - montage automatiquement
il est aussi possible d'ajouter le montage dans le fichier nano /etc/fstab
Et pour une raison qu'il m'échappe, la le paramètre password fonctionne comme un charme!!

# NetStock share
//192.168.1.xxx/netstock /mnt/netstock            cifs    user=share_username,_netdev,uid=local_user_owning_files,password=XXXXX              0       0

Le paramètre _netdev informe fstab qu'il faut attendre que le périphérique réseau soit disponible avant de procéder au montage.

Pour recharger le fichier fstab, il suffit de faire un mount -a

lundi 16 mai 2016

Thunderbird - Modifier l'entête et pied de page de façon définitive

Dans Thunderbird, vous avez la possibilité de modifier l'information imprimée dans l'entête et le pied de page lors de l'impression de vos messages.
Options d'impression de Thunderbird
C'est cool... mais c'est aussi ce qui, ce soir, énerve plus particulièrement Françoise (Thunderbird sous Linux Mint).

Si, comme Françoise, vous ne désirez pas voir ces informations imprimés sur avec vos mails... vous aurez la mauvaise surprise de devoir les modifier pour chaque nouvelle impression... heure après heure, jour après jour.
Cela en énerverais plus d'un!

Voici la marche à suivre pour modifier définitivement ce paramètrage:

1) Ouvrir les préférences de Thunderbird
2) Vous rendre dans les paramètres "Avancés"
3) Sélectionner le voler "Général"
4) Cliquer sur l "éditeur de configuration"

Ouvrir l'éditeur de configuration
Faites une recherche sur les paramètres relatif à l'impression.
Saisissez "print" dans la zone de recherche.
Editer les paramètres d'entête et de pied de page
Cherchez ensuite "print.print_footerleft" et compagnie.
Il ne vous reste plus qu'a modifier les différents paramètres (pour ce qui nous concerne, nous avons effacé le contenu pour ne plus avoir de pied de page et d'entête).




x
x

jeudi 31 mars 2016

CoreUtils: si la commande LS vous manque trop sous Windows...

Je passe souvent d'une machine Linux à Windows et vice-versa.
Le plus dure, c'est de se passer des commandes ls, cp, mv et nano sous Windows... Arf

Il existe bien CygWin mais ce dernier n'a pas la meilleure réputation (surtout pour son côté usine à gaz). Voici donc une alternative.

CoreUtils
Je vous propose de jeter un coup d'oeil sur le projet "CoreUtils : GNU Core Utils" qui permet de retrouver cet outils et de nombreux autres sur votre machine Windows.
CoreUtils : GNU Core Utils
CoreUtils propose un programme d'installation sous Windows :-)
Il vous suffira d'ajouter le répertoire "C:\Program Files (x86)\GnuWin32\bin" dans la variable PATH de votre système Windows.
CoreUtils dispose également d'une excellente documentation (176 pages) au format pdf et chm accessible via le menu Windows.

Nano
Nano est un éditeur en mode console. Barbare de prime abord, c'est un outil que l'on manipule régulièrement dès que l'on utilise une connexion SSH, soit un Raspberry Pi où il est incontournable.
Une fois habitué, il est très commode d'usage et surtout accessible en ligne de commande.
Nano est téléchargeable depuis http://www.nano-editor.org/
Editeur Nano - www.nano-editor.org
Pour installer nano:
  • Placez nano.exe et les dll de nano dans c:\windows\sysWOW64\  (pour un système Win7)

samedi 20 février 2016

Python : Lecture de carte eID Belge avec Python

Bien que cet article concerne la lecture de eID Belge sur Raspberry-Pi, la bibliothèque et le code doivent pouvoir être utilisé avec d'autres systèmes.
Bonne lecture
Dominique
 
En Belgique, les carte d'identités sont équipées de puce Smart Card. Cela permet d'emporter:
  • Un certificat CitizenBE utilisé pour la signature et authentification numérique du citoyen (protégé par une mot de passe).
  • D'autres informations librement accessible comme le nom, prénom, ....
Toutes ces informations étant décrites dans des spécifications ouvertes publiées sur le Net par l'eGouvernement Belge il y a une décennie.

Des spécifications ouvertes... c'est génial, du coup, nous avons une connaissance qui s'est lancé dans le projet fou de faire lire des cartes d'identités beid (carte d'identité Belge) par un Raspberry-Pi sous Jessie et en Python 3 s'il vous plaît! C'est trop de la balle.

from beid.beid import scan_readers, read_infos, triggered_decorator
from pprint import pprint
from time import sleep

# retrieve a list of available readers
r = scan_readers()[0]

# declare a function that will be executed automatically when a card is removed/insterted
# funcion arguments should be :
# - action : which will be "inserted" or "removed" when the function will be called
# - card : which will be the card if inserted
# - reader : which will hold  the name of the reader to use 

@triggered_decorator
def basic_read(action, card, reader=r.name):
    if action=="inserted":
        i = read_infos(card)
        pprint(i)

sleep(5)

infos = read_infos(r, read_photo=True)
with open("photo.jpg", "wb") as f:
    f.write(infos['photo'])

Vous trouverez pythonbeid sur le GitHub de Lapin Blanc.

Un grand merci pour ce partage avec la communauté.
Dominique