OVH Cloud OVH Cloud

scripting via Python et gros fichiers

22 réponses
Avatar
Rémi Hérilier
Bonjour,

Je suis en train d'étudier la possibilité d'utiliser Python comme
langage de script dans un programme en C++. En fait, le script Python me
servira à stocker des données pour mon programme et se présentera sous
la forme d'une suite de commande.

Mes quelques tests m'ont montré que Python lit/compile d'une traite
le fichier Python et ne l'éxécute qu'une fois la lecture/compilation
finie. Un essai sur un fichier de 15 Mo m'a contraint à tuer le
processus qui avait bouffé mes 512 Mo de ram et 1 Go de swap.

Mon test est très bête puisqu'il utilise PyParser_SimpleParseFile mais
après avoir lu la doc et fait tourner Google (et essayé 2 ou 3 trucs à
moitié compris), je n'ai finalement pas trouvé comment dire à Python
qu'il devait évaluer mon script pas à pas.

À part charger à la main une commande complète puis la passer à
PyParser_SimpleParseString, je ne vois pas trop.

De plus, le fait d'avoir un langage complet (boucle for, if, etc) serait
appréciable pour pouvoir tester le comportement de mon programme.

Avec cette possibilité là, extraire une commande pour l'éxécuter est
autre chose qu'un banal fgetline. En effet, il faudrait, par exemple,
extraire un bloc for en entier, chose qui me semble bien ardue.

Bref, je reste dubitatif ... utiliser Python (ou tout autre langage de
script) est-il une bonne idée ...

Les avis de gens plus experts ou plus avisés sont les bienvenus.


cordialement

Rémi Hérilier

10 réponses

1 2 3
Avatar
Christophe Cavalaria
Rémi Hérilier wrote:

Bonjour,

Je suis en train d'étudier la possibilité d'utiliser Python comme
langage de script dans un programme en C++. En fait, le script Python me
servira à stocker des données pour mon programme et se présentera sous
la forme d'une suite de commande.

Mes quelques tests m'ont montré que Python lit/compile d'une traite
le fichier Python et ne l'éxécute qu'une fois la lecture/compilation
finie. Un essai sur un fichier de 15 Mo m'a contraint à tuer le


15Mo ! Découpe ça en petits fichiers. J'ai vraiment du mal à croire que un
être humain normal à écrit ce fichier et donc que ce fichier a probablement
été généré automatiquement.

processus qui avait bouffé mes 512 Mo de ram et 1 Go de swap.

Mon test est très bête puisqu'il utilise PyParser_SimpleParseFile mais
après avoir lu la doc et fait tourner Google (et essayé 2 ou 3 trucs à
moitié compris), je n'ai finalement pas trouvé comment dire à Python
qu'il devait évaluer mon script pas à pas.


Ce n'est pas possible. Ceci n'est pas un usage prévu.

À part charger à la main une commande complète puis la passer à
PyParser_SimpleParseString, je ne vois pas trop.


C'est pourtant la seule solution si tu persiste sur cette voie.

De plus, le fait d'avoir un langage complet (boucle for, if, etc) serait
appréciable pour pouvoir tester le comportement de mon programme.


La présence de construction plus complexes rendra la fonction de découpage
de ton programme plus complexe elle aussi et pour peu que tu aie besoin
d'une fonction de 10Mo, tu auras encore le même programme.

Avec cette possibilité là, extraire une commande pour l'éxécuter est
autre chose qu'un banal fgetline. En effet, il faudrait, par exemple,
extraire un bloc for en entier, chose qui me semble bien ardue.

Bref, je reste dubitatif ... utiliser Python (ou tout autre langage de
script) est-il une bonne idée ...


Ton script de 15Mo va probablement s'executer avec une lenteur incroyable
dans un langage qui interprete directement le source sans passer par du
bytecode intermédiaire.

Les avis de gens plus experts ou plus avisés sont les bienvenus.


cordialement

Rémi Hérilier


Je pense vraiment que tu ne trouveras pas de langage tout pret pour faire ce
que tu veux. En partant de la suposition que le script est généré
automatiquement, je ne peux que conseillé de faire les chose autrement
comme d'enregistrer une version binaire rapide à charger des données et
d'écrire un script de taille plus raisonable qui se chargera de lire ces
informations et de les passer au programme C++ principal.

Avatar
F. Petitjean
Bonjour,

Je suis en train d'étudier la possibilité d'utiliser Python comme
langage de script dans un programme en C++. En fait, le script Python me
servira à stocker des données pour mon programme et se présentera sous
la forme d'une suite de commande.

Mes quelques tests m'ont montré que Python lit/compile d'une traite
le fichier Python et ne l'éxécute qu'une fois la lecture/compilation
finie. Un essai sur un fichier de 15 Mo m'a contraint à tuer le
processus qui avait bouffé mes 512 Mo de ram et 1 Go de swap.

C'est le troll du vendredi mais là vraiment vous y allez fort !


Pourrait-on avoir un extrait (du genre les 30 premières lignes et les
trente dernières ) de ce fichier Python ?

Les avis de gens plus experts ou plus avisés sont les bienvenus.


cordialement

Rémi Hérilier


--
Vu dans une signature d'un développeur Debian
cat /dev/urandom | perl

Avatar
kaerbuhez
Bonjour,

Je suis en train d'étudier la possibilité d'utiliser Python comme
langage de script dans un programme en C++. En fait, le script Python me
servira à stocker des données pour mon programme et se présentera sous
la forme d'une suite de commande.

Est-ce que cela veut dire que tu mets tes données dans ton script Python

? ...

Mes quelques tests m'ont montré que Python lit/compile d'une traite
le fichier Python et ne l'éxécute qu'une fois la lecture/compilation
finie. Un essai sur un fichier de 15 Mo m'a contraint à tuer le
processus qui avait bouffé mes 512 Mo de ram et 1 Go de swap.

... et que, peut-être, tes 15 Mo c'est 14,9 Mo de données et 100 Ko de

code ???

Si oui, c'est ça que je changerais. Si tu mets tes données dans un
fichier parsable facilement (module csv par exemple) et ton code python
dans un autre que tu interfaces avec ton code C++, je pense que ton
probléme est résolu et tu peux utiliser toute la puissance de Python.


Mon test est très bête puisqu'il utilise PyParser_SimpleParseFile mais
après avoir lu la doc et fait tourner Google (et essayé 2 ou 3 trucs à
moitié compris), je n'ai finalement pas trouvé comment dire à Python
qu'il devait évaluer mon script pas à pas.

Je suppose que tu peux lire ligne par ligne et faire un exec dessus.

Tout ceci en python bien sûr. Je ne crois pas que ce soit une bonne idée
pour ce qui est d'éxecuter la logique Python. C'est peut-être une option
pour le fichier de données que je suggére ci-dessus si tu le crée au
"format python" (une suite d'assignations Python) ... mais ce n'est pas
celle que je choisirais à priori.

À part charger à la main une commande complète puis la passer à
PyParser_SimpleParseString, je ne vois pas trop.



Pas compétent la-dessus ...

De plus, le fait d'avoir un langage complet (boucle for, if, etc) serait
appréciable pour pouvoir tester le comportement de mon programme.

:-)

Avec cette possibilité là, extraire une commande pour l'éxécuter est
autre chose qu'un banal fgetline. En effet, il faudrait, par exemple,
extraire un bloc for en entier, chose qui me semble bien ardue.

Bref, je reste dubitatif ... utiliser Python (ou tout autre langage de
script) est-il une bonne idée ...

non, non pas "ou tout autre langage de script" ;-)


Les avis de gens plus experts ou plus avisés sont les bienvenus.


Oui, oui et n'hésitez pas à préciser (ou corriger ?) si nécessaire.

En espérant t'avoir au moins un tout petit peu aidé.


cordialement

Rémi Hérilier


Avatar
Rémi Hérilier
Christophe Cavalaria wrote:

15Mo ! Découpe ça en petits fichiers. J'ai vraiment du mal à croire que un
être humain normal à écrit ce fichier et donc que ce fichier a probablement
été généré automatiquement.


effectivement, j'ai généré autmatiquement ce gros fichiers, je ne suis
quand même pas fou pour taper 130000 lignes :)

Ce n'est pas possible. Ceci n'est pas un usage prévu.


merci de confirmer le doute que j'avais.

C'est pourtant la seule solution si tu persiste sur cette voie.


je sais =)

La présence de construction plus complexes rendra la fonction de découpage
de ton programme plus complexe elle aussi et pour peu que tu aie besoin
d'une fonction de 10Mo, tu auras encore le même programme.


pas faux :/

Ton script de 15Mo va probablement s'executer avec une lenteur incroyable
dans un langage qui interprete directement le source sans passer par du
bytecode intermédiaire.


du code flex/bison n'a rien de lent, son seul problème est qu'il plante
sur ma grammaire :/

Je pense vraiment que tu ne trouveras pas de langage tout pret pour faire ce
que tu veux. En partant de la suposition que le script est généré
automatiquement, je ne peux que conseillé de faire les chose autrement
comme d'enregistrer une version binaire rapide à charger des données et
d'écrire un script de taille plus raisonable qui se chargera de lire ces
informations et de les passer au programme C++ principal.


C'est effectivement une des voies qui me restent.

en tout cas, merci à toi pour des conseils.

cordialement

Rémi Hérilier

Avatar
Rémi Hérilier
F. Petitjean wrote:

Bonjour,

Je suis en train d'étudier la possibilité d'utiliser Python comme
langage de script dans un programme en C++. En fait, le script Python me
servira à stocker des données pour mon programme et se présentera sous
la forme d'une suite de commande.

Mes quelques tests m'ont montré que Python lit/compile d'une traite
le fichier Python et ne l'éxécute qu'une fois la lecture/compilation
finie. Un essai sur un fichier de 15 Mo m'a contraint à tuer le
processus qui avait bouffé mes 512 Mo de ram et 1 Go de swap.



C'est le troll du vendredi mais là vraiment vous y allez fort !


Désolé de le lancer, ce n'était pas l'intention première =)

Pourrait-on avoir un extrait (du genre les 30 premières lignes et les
trente dernières ) de ce fichier Python ?


en voici un exemple (court:)

--- debut ---

output( "rgbe" )
outformat( "output_cornell", -1 )
sampler( "image", "box", "samples", 1 )
resolution( 400, 400, 1.0 )

renderer("whitted", "maxdepth", 1, "shadow", 10 );

framebegin( 1 )

view( 278, 273, -800, 278, 273, 0, 0, 1, 0 )
camera( "persp", "fov", 45 )

# a non perfect lambert brdf
matter( "lambert", "r", 0.8 )

# light
radiance( 250000. )
color(1.0, 1.0, 1.0)
object( "triangle", "v", [ 343.0, 538.8, 227.0, 343.0, 538.8, 332.0,
213.0, 538.8, 332.0 ] )
object( "triangle", "v", [ 343.0, 538.8, 227.0, 213.0, 538.8, 332.0,
213.0, 538.8, 227.0 ] )
radiance(-1.0 )

# right wall
color(0.0,1.0,0.0)
object( "triangle", "v", [ 0.0, 0.0, 559.2, 0.0, 0.0, 0.0, 0.0, 548.8,
0.0 ] )
object( "triangle", "v", [ 0.0, 0.0, 559.2, 0.0, 548.8, 0.0, 0.0, 548.8,
559.2 ] )

# ceiling
color(1.0, 1.0, 1.0)
object( "triangle", "v", [ 556.0, 548.8, 0.0, 556.0, 548.8, 559.2, 0.0,
548.8, 559.2 ] )
object( "triangle", "v", [ 556.0, 548.8, 0.0, 0.0, 548.8, 559.2, 0.0,
548.8, 0.0 ] )

# floor
object( "triangle", "v", [ 552.8 , 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 559.2 ] )
object( "triangle", "v", [ 552.8 , 0.0, 0.0, 0.0, 0.0, 559.2, 549.6,
0.0, 559.2 ] )

# back wall
object( "triangle", "v", [ 549.6, 0.0, 559.2, 0.0, 0.0, 559.2, 0.0,
548.8, 559.2 ] )
object( "triangle", "v", [ 549.6, 0.0, 559.2, 0.0, 548.8, 559.2, 556.0,
548.8, 559.2 ] )

# left wall
color( 1.0, 0.0, 0.0 )
object( "triangle", "v", [ 552.8, 0.0, 0.0, 549.6, 0.0, 559.2, 556.0,
548.8, 559.2 ] )
object( "triangle", "v", [ 552.8, 0.0, 0.0, 556.0, 548.8, 559.2, 556.0,
548.8, 0.0 ] )

# small block
color( 1.0, 1.0, 1.0 )
object( "triangle", "v", [ 130.0, 165.0, 65.0, 82.0, 165.0, 225.0,
240.0, 165.0, 272.0 ] )
object( "triangle", "v", [ 130.0, 165.0, 65.0, 240.0, 165.0, 272.0,
290.0, 165.0, 114.0 ] )

object( "triangle", "v", [ 290.0, 0.0, 114.0, 290.0, 165.0, 114.0,
240.0, 165.0, 272.0 ] )
object( "triangle", "v", [ 290.0, 0.0, 114.0, 240.0, 165.0, 272.0,
240.0, 0.0, 272.0 ] )

object( "triangle", "v", [ 130.0, 0.0, 65.0, 130.0, 165.0, 65.0, 290.0,
165.0, 114.0 ] )
object( "triangle", "v", [ 130.0, 0.0, 65.0, 290.0, 165.0, 114.0, 290.0,
0.0, 114.0 ] )

object( "triangle", "v", [ 82.0, 0.0, 225.0, 82.0, 165.0, 225.0, 130.0,
165.0, 65.0 ] )
object( "triangle", "v", [ 82.0, 0.0, 225.0, 130.0, 165.0, 65.0, 130.0,
0.0, 65.0 ] )

object( "triangle", "v", [ 240.0, 0.0, 272.0, 240.0, 165.0, 272.0, 82.0,
165.0, 225.0 ] )
object( "triangle", "v", [ 240.0, 0.0, 272.0, 82.0, 165.0, 225.0, 82.0,
0.0, 225.0 ] )

# tall block
object( "triangle", "v", [ 423.0, 330.0, 247.0, 265.0, 330.0, 296.0,
314.0, 330.0, 456.0 ] )
object( "triangle", "v", [ 423.0, 330.0, 247.0, 314.0, 330.0, 456.0,
472.0, 330.0, 406.0 ] )

object( "triangle", "v", [ 423.0, 0.0, 247.0, 423.0, 330.0, 247.0,
472.0, 330.0, 406.0 ] )
object( "triangle", "v", [ 423.0, 0.0, 247.0, 472.0, 330.0, 406.0,
472.0, 0.0, 406.0 ] )

object( "triangle", "v", [ 472.0, 0.0, 406.0, 472.0, 330.0, 406.0,
314.0, 330.0, 456.0 ] )
object( "triangle", "v", [ 472.0, 0.0, 406.0, 314.0, 330.0, 456.0,
314.0, 0.0, 456.0 ] )

object( "triangle", "v", [ 314.0, 0.0, 456.0, 314.0, 330.0, 456.0,
265.0, 330.0, 296.0 ] )
object( "triangle", "v", [ 314.0, 0.0, 456.0, 265.0, 330.0, 296.0,
265.0, 0.0, 296.0 ] )

object( "triangle", "v", [ 265.0, 0.0, 296.0, 265.0, 330.0, 296.0,
423.0, 330.0, 247.0 ] )
object( "triangle", "v", [ 265.0, 0.0, 296.0, 423.0, 330.0, 247.0,
423.0, 0.0, 247.0 ] )

frameend()


--- fin ---

il contient une image (délimitée par framebegin( X ) et frameend()) et
qu'elle contient 34 objets de type triangle.

Pour s'imaginer celui de 15 Mo, il y n'y a qu'a se dire qu'il y a 125
images et qu'elles contiennent chacunes 1000 objets (pour un total de 130000
lignes et des poussières).

voilà =)

cordialement

Rémi Hérilier


Avatar
Rémi Hérilier
kaerbuhez wrote:

Bonjour,

Je suis en train d'étudier la possibilité d'utiliser Python comme
langage de script dans un programme en C++. En fait, le script Python
me servira à stocker des données pour mon programme et se présentera
sous la forme d'une suite de commande.

Est-ce que cela veut dire que tu mets tes données dans ton script Python

? ...


c'est effectivement le cas.


Mes quelques tests m'ont montré que Python lit/compile d'une traite
le fichier Python et ne l'éxécute qu'une fois la lecture/compilation
finie. Un essai sur un fichier de 15 Mo m'a contraint à tuer le
processus qui avait bouffé mes 512 Mo de ram et 1 Go de swap.

... et que, peut-être, tes 15 Mo c'est 14,9 Mo de données et 100 Ko de

code ???


On peut dire ça. Je te renvois à ma réponse à F. PetitJean pour avoir
un exemple des fichiers.


Si oui, c'est ça que je changerais. Si tu mets tes données dans un
fichier parsable facilement (module csv par exemple) et ton code python
dans un autre que tu interfaces avec ton code C++, je pense que ton
probléme est résolu et tu peux utiliser toute la puissance de Python.


Justement, j'aimerai conserver tout dans un seul fichier :/

Mon test est très bête puisqu'il utilise PyParser_SimpleParseFile mais
après avoir lu la doc et fait tourner Google (et essayé 2 ou 3 trucs à
moitié compris), je n'ai finalement pas trouvé comment dire à Python
qu'il devait évaluer mon script pas à pas.

Je suppose que tu peux lire ligne par ligne et faire un exec dessus.

Tout ceci en python bien sûr. Je ne crois pas que ce soit une bonne idée
pour ce qui est d'éxecuter la logique Python. C'est peut-être une option
pour le fichier de données que je suggére ci-dessus si tu le crée au
"format python" (une suite d'assignations Python) ... mais ce n'est pas
celle que je choisirais à priori.

À part charger à la main une commande complète puis la passer à
PyParser_SimpleParseString, je ne vois pas trop.



Pas compétent la-dessus ...


Pas grave, Christophe Cavalaria a pu le faire.

De plus, le fait d'avoir un langage complet (boucle for, if, etc) serait
appréciable pour pouvoir tester le comportement de mon programme.

:-)


Avec cette possibilité là, extraire une commande pour l'éxécuter est
autre chose qu'un banal fgetline. En effet, il faudrait, par exemple,
extraire un bloc for en entier, chose qui me semble bien ardue.

Bref, je reste dubitatif ... utiliser Python (ou tout autre langage de
script) est-il une bonne idée ...

non, non pas "ou tout autre langage de script" ;-)



Désolé :>

j'avais commencé par tester Lua mais son bytecode limite les tableaux à
262144 éléments. D'où mes essais avec Python.

Oui, oui et n'hésitez pas à préciser (ou corriger ?) si nécessaire.

En espérant t'avoir au moins un tout petit peu aidé.



Tu me permet de rajouter une pierre à l'édifice "mauvaise idée
d'utiliser Python dans mon cas" ;)

Mais je pense que je vais me rabattre sur un parser à la mano (adieu les
facilités d'un langage de programmation) et passer par un script
d'export pour Blender.

cordialement

Rémi Hérilier


Avatar
F. Petitjean
F. Petitjean wrote:

C'est le troll du vendredi mais là vraiment vous y allez fort !


Désolé de le lancer, ce n'était pas l'intention première =)

Pourrait-on avoir un extrait (du genre les 30 premières lignes et les
trente dernières ) de ce fichier Python ?


en voici un exemple (court:)

--- debut ---

output( "rgbe" )
outformat( "output_cornell", -1 )
sampler( "image", "box", "samples", 1 )
resolution( 400, 400, 1.0 )

renderer("whitted", "maxdepth", 1, "shadow", 10 );

framebegin( 1 )

view( 278, 273, -800, 278, 273, 0, 0, 1, 0 )
camera( "persp", "fov", 45 )

# a non perfect lambert brdf
matter( "lambert", "r", 0.8 )

# light
radiance( 250000. )
color(1.0, 1.0, 1.0)
object( "triangle", "v", [ 343.0, 538.8, 227.0, 343.0, 538.8, 332.0,
213.0, 538.8, 332.0 ] )
object( "triangle", "v", [ 343.0, 538.8, 227.0, 213.0, 538.8, 332.0,
213.0, 538.8, 227.0 ] )
radiance(-1.0 )

snip


frameend()


Sur comp.lang.python vous auriez droit à des commentaires du genre Ick
et 'yuck'.

Je ne vois pas de code python, seulement ce qui semble des appels à des
fonctions. Vous n'auriez pas des exeptions NameError par hasard ? Si la
réponse est non, c'est que vous nous avez caché la seule partie
intéressante :-) [1]

Blague à part, faut trouver un moyen pour passer les paramètres de ces
fonctions depuis le code C++ vers un interpréteur Python embarqué
(embedded?) directement, pas à coup d'eval ou de PyRun_Jenesaispasquoi.
Les possibilités de faire ce lien sont multiples :
swig, SIP, boost_python, etc .
Les paramètres seront passés en binaire et comme ce sont en majorité des
chiffres cela devrait aller nettement mieux.

il contient une image (délimitée par framebegin( X ) et frameend()) et
qu'elle contient 34 objets de type triangle.

Pour s'imaginer celui de 15 Mo, il y n'y a qu'a se dire qu'il y a 125
images et qu'elles contiennent chacunes 1000 objets (pour un total de 130000
lignes et des poussières).

voilà =)

cordialement

Rémi Hérilier


Note
[1] en regardant le nom des fonctions, il n'y aurait pas un from
blender import * au début du fichier ?


Avatar
Rémi Hérilier

Sur comp.lang.python vous auriez droit à des commentaires du genre Ick
et 'yuck'.


j'en conviens :))

mais si je suis là, c'est pour trouver une solution convevable ;)

Je ne vois pas de code python, seulement ce qui semble des appels à des
fonctions. Vous n'auriez pas des exeptions NameError par hasard ? Si la
réponse est non, c'est que vous nous avez caché la seule partie
intéressante :-) [1]


il n'y a absolument rien de caché. On m'a demandé un exemple de fichier,
je l'ai donné :))

à la rigueur, ce qui peut manquer, c'est l'init du bouzin qui ajoute à
Python ma vingtaine de fonction :

--- début ---

static PyMethodDef crbn_methods[] = {
...
{NULL, NULL, 0, NULL}
};

void py_binding_init( crbn_context_t* ctx )
{
PyObject *m, *d;
PyObject *pcc = PyCObject_FromVoidPtr( ctx, NULL );

Py_Initialize();

m = PyImport_AddModule( "__builtin__" );
d = PyModule_GetDict( m );
PyDict_SetItemString( d, PYCRBNCONTEXT, pcc );

m = Py_InitModule( "crbn", crbn_methods );

PyRun_SimpleString( "from math import *n" );
PyRun_SimpleString( "from crbn import *n" );
}

--- fin ---

(J'ai un peu honte des 2 PyRun_SimpleString mais Blender le fait
alors bon=)

et peut être ma façon de lancer de charger les données :

-- debut ---

fp = fopen( filename, "r" );
PyRun_SimpleFile( fp, filename );
fclose( fp );

--- fin ---

mais je doute que ça fasse avancer le schmilblick.

Blague à part, faut trouver un moyen pour passer les paramètres de ces
fonctions depuis le code C++ vers un interpréteur Python embarqué
(embedded?) directement, pas à coup d'eval ou de PyRun_Jenesaispasquoi.
Les possibilités de faire ce lien sont multiples :
swig, SIP, boost_python, etc .
Les paramètres seront passés en binaire et comme ce sont en majorité des
chiffres cela devrait aller nettement mieux.


merci, je vais aller zieuter du côté de ces programmes.

Note
[1] en regardant le nom des fonctions, il n'y aurait pas un from
blender import * au début du fichier ?


non je développe un raytracer indépendant de tout logiciel de
modélisation mais un script d'export est prévu pour Blender ;)

merci encore

Rémi Hérilier

Avatar
Rémi Hérilier

Sur comp.lang.python vous auriez droit à des commentaires du genre Ick
et 'yuck'.


j'en conviens :))

mais si je suis là, c'est pour trouver une solution convenable ;)

Je ne vois pas de code python, seulement ce qui semble des appels à des
fonctions. Vous n'auriez pas des exeptions NameError par hasard ? Si la
réponse est non, c'est que vous nous avez caché la seule partie
intéressante :-) [1]


il n'y a absolument rien de caché. On m'a demandé un exemple de fichier,
je l'ai donné :))

plus sérieusement, ce qui peut manquer, c'est l'init du bouzin qui
ajoute à Python ma vingtaine de fonction :

--- début ---

static PyMethodDef crbn_methods[] = {
...
{NULL, NULL, 0, NULL}
};

void py_binding_init( crbn_context_t* ctx )
{
PyObject *m, *d;
PyObject *pcc = PyCObject_FromVoidPtr( ctx, NULL );

Py_Initialize();

m = PyImport_AddModule( "__builtin__" );
d = PyModule_GetDict( m );
PyDict_SetItemString( d, PYCRBNCONTEXT, pcc );

m = Py_InitModule( "crbn", crbn_methods );

PyRun_SimpleString( "from math import *n" );
PyRun_SimpleString( "from crbn import *n" );
}

--- fin ---

(J'ai un peu honte des 2 PyRun_SimpleString mais Blender le fait
alors bon=)

et peut être ma façon de lancer de charger les données :

-- debut ---

fp = fopen( filename, "r" );
PyRun_SimpleFile( fp, filename );
fclose( fp );

--- fin ---

mais je doute que ça fasse avancer le schmilblick.

Blague à part, faut trouver un moyen pour passer les paramètres de ces
fonctions depuis le code C++ vers un interpréteur Python embarqué
(embedded?) directement, pas à coup d'eval ou de PyRun_Jenesaispasquoi.
Les possibilités de faire ce lien sont multiples :
swig, SIP, boost_python, etc .
Les paramètres seront passés en binaire et comme ce sont en majorité des
chiffres cela devrait aller nettement mieux.


ça serait une idée mais je cherche à n'avoir qu'un seul fichier pour
contenir les données.

J'vais reessayer avec flex/bison et si ça me plante toujours entre les
doigts, j'attaquerai un parser à la mano.

Note
[1] en regardant le nom des fonctions, il n'y aurait pas un from
blender import * au début du fichier ?


non je développe un raytracer indépendant de tout logiciel de
modélisation mais un script d'export est prévu pour Blender ;)

merci encore

Rémi Hérilier

Avatar
Paul Gaborit
À (at) Fri, 13 May 2005 11:45:43 +0200,
Rémi Hérilier écrivait (wrote):
Mais je pense que je vais me rabattre sur un parser à la mano (adieu les
facilités d'un langage de programmation) et passer par un script d'export
pour Blender.


Ce qui serait peut-être envisageable, ce serait un format de fichier purement
descriptif (en XML ou en texte pur) ouvert... Ouvert dans le sens où vous
pourriez y ajouter de nouveaux types (ou commandes) dynamiquement décrits en
python.

Dans votre programme, vous utilisez python ou C++ pour parser les données et
lorsque vous rencontrez la description d'un nouveau type alors vous dégainez
votre interpréteur/compilateur python pour l'ajouter dynamiquement...
L'intérêt serait de limiter la partie code dynamique aux seuls endroits
vraiment utiles.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

1 2 3