Blender Python
Blender Python
Utiliser les modules intégrés
(builtin) pour se passer
du fichier: "os.py".
Utiliser les modules intégrés
Avertissement et précautions.
Les quelques lignes que vous allez lire, sont le compte-rendu d'une série d'expériences menées dans le cadre de la réalisation du fichier "Shell Factory", qui est un plugin Python pour le logiciel intégré de 3D: Blender. Elles ont été intensivement testées et n'ont pas posé de problème sous Win98, cependant, si vous êtiez tentés de les mettre en application pour votre propre compte, sachez qu'en aucun cas, l'auteur de ce texte ne pourrait être tenu pour responsable de ce qui arriverait de pas agréable, à vous, à vos fichiers, à votre machine ou à vos animaux domestiques.

Comme vous le savez peut-être déjà, le python est un langage extrèmement allégé. Ses fonctions de base, celles que l'on peut utiliser immédiatement, sont limitées au strict minimum. Les manipulations pour les contrôler se résument à un "dir(__builtins__)":
['ArithmeticError', 'AssertionError', 'AttributeError', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'FloatingPointError', 'IOError', 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplementedError', 'OSError', 'OverflowError', 'RuntimeError', 'StandardError', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError', 'ValueError', 'ZeroDivisionError', '__debug__', '__doc__', '__import__', '__name__', 'abs', 'apply', 'buffer', 'callable', 'chr', 'cmp', 'coerce', 'compile', 'complex', 'delattr', 'dir', 'divmod', 'eval', 'execfile', 'exit', 'filter', 'float', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'len', 'list', 'locals', 'long', 'map', 'max', 'min', 'oct', 'open', 'ord', 'pow', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'round', 'setattr', 'slice', 'str', 'tuple', 'type', 'vars', 'xrange']

Cette procedure doit être réalisée dans un interpréteur Python (que ce soit sous linux ou windows). Il est bon de préciser que la même commande, lancée à partir de l'éditeur de Blender, renvoie un résultat un peu différent:


Mais cela ne change en rien la disponibilité des fonctions intégrées. Une liste existe mais sous la forme d'un dictionnaire, que " print __builtins__ "(plus ALT-p), devrait faire apparaître


Le python offre la capacité d'augmenter le nombres de ces fonctions en chargeant des "modules" supplémentaires. Il y a deux types de modules: les intégrés et les autres. Les "autres" font partie du python intégral, ils se trouvent dans des sous-répertoires de l'installation complète de ce dernier. Cette distance relative (le sous-répertoire est un ailleurs qu'il faut savoir gérer) est naturellement un inconvénient si le système d'exploitation n'a pas une configuration correcte (à ce sujet, voir la page "Corriger le path"). Pour éviter ces quelques problèmes d'importation, il peut être intéressant d'essayer de n'utiliser que les modules intégrés. La première opération à mener est l'identification. La documentation reste assez floue sur les noms. Mais, comme pour les fonctions, il est possible de faire un appel direct au python, qui renverra un tuple (un liste invariable) de tous les modules disponibles.
Le tuple en question se trouve dans le module sys, et cette fois-ci il est possible d'utiliser le traitement de texte de Blender. Vous tapez donc les deux lignes suivantes: :
from sys import builtin_module_names
print builtin_module_names

et vous faites ALT-p, vous obtiendrez la ligne:

("__builtin__", "__main__", "_locale", "_socket", "array", "audioop", "binascii", "cPickle", "cStringIO", "cmath", "errno", "imageop", "imp", "marshal", "math", "md5", "msvcrt", "new", "nt", "operator", "pcre", "regex", "rgbimg", "rotor", "select", "sha", "signal", "soundex", "strop", "struct", "sys", "thread", "time", "winsound")

S'il a été possible d'importer le module sys, c'est tout simplement qu'il s'agit d'un module intégré. On peut facilement le vérifier, il est bien dans la liste. Toutes les fonctions qui se trouvent dans ce module sont donc à notre disposition.
Tapez: l=dir(sys); print l
Ha? une erreur? Bien sûr, il faut d'abord importer le module avant de l'utiliser, et jusqu'à présent cela n'a pas été fait. Nous n'avons pris qu'une partie du module et pas le module lui-même. Pour que cela marche, il faut recommencer et faire:
import sys; from sys import *; l=dir(sys); print l
Résultat:
['__doc__', '__name__', '__stderr__', '__stdin__', '__stdout__', 'builtin_module_names', 'copyright', 'dllhandle', 'exc_info', 'exec_prefix', 'executable', 'exit', 'getrefcount', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'maxint', 'modules', 'path', 'platform', 'prefix', 'setcheckinterval', 'setprofile', 'settrace', 'stderr', 'stdin', 'stdout', 'version', 'winver']


Un exemple concret: imaginons un instant que je veuille récupérer tous les noms de fichier qui se trouvent dans le répertoire courant. Un coup d'oeil sur l'index génénral de la Python Librairie Reference (documentation officielle à récupérer sur www.python.org) me permet de voir qu'il existe un fonction listdir dans le module os. Il ne me reste plus qu'à récupérer cette fonction et à l'utiliser.
from os import listdir; l=listdir('.'); print l;
Ce qui me donne:
['Readme.txt', 'Copyright.txt', 'test.rib', 'vect.py', 'whrandom.py', 'SubSurf.dll', 'testlyria00.cqlg', 'lyria00.cqlg', 'ammonite001.cqlg', 'Oxystele00.cqlg', 'nautilus00.cqlg', 'lyria1.cqlg', 'list_recap.cqls', 'test.txt']
Mais le module os n'est pas un module embarqué, c'est un module perdu au bout d'un long chemin qui n'est peut-être pas correctement identifié sur les machines où mon script sera exécuté. Comme le module os  a pour principale fonction d'interfacer Python avec n'importe qu'elle plate-forme, il est possible de lui trouver un remplaçant : le module nt (ou eventuellement posix  si on utilise une plate-forme Unix). Il ne reste plus qu'à tenter :
from nt import listdir; l=listdir('.'); print l;
Pour rendre le script compatible avec linux, il suffit de faire un test sur la liste builtin_module_names.
from sys import builtin_module_names
if 'nt' in builtin_module_names:
     from nt import listdir
if 'posix' in builtin_module_names:
     from posix import listdir
l=listdir('.'); print l


cobalt, 9 Aout 2000