Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

simple inclusion de fichier

9 réponses
Avatar
Etienne Marache
Bonjour,

mon problème se présente de la façon suivante: un programme A.py (son
vrai nom est latexbd.py, voir lien ci-dessous) exécute du code en
prenant ses données dans un fichier F.tex. Bien que mon code python soit
surement très mauvais, cela marche extrèmement bien, mais je voudrais maintenant
inclure directement des lignes de code et là je bute:

- première idée lire les lignes dans F.tex et les exécuter.

- deuxième idée, écrire les lignes dans un fichier B.py puis inclure ce
fichier dans A.py.

La première méthode semble vouée à l'échec mais je me trompe
peut-être. Je pensais que la seconde pouvait marcher mais je n'ai rien
trouvé de concluant dans la doc, j'ai peut-être mal cherché. J'ai essayé
execfile et import mais j'ai des erreurs car le code de B.py fait appel
à celui de A.py alors que ces commandes ne semblent pas le permettre.

Peut-on procéder comme je l'envisage? Dois-je changer de stratégie?
Merci pour votre aide.

Etienne

http://perso.orange.fr/Etienne.Marache/latex/lbd/latexbd.html

9 réponses

Avatar
Pierre Quentel
On 22 avr, 08:47, Etienne Marache wrote:
Bonjour,

mon problème se présente de la façon suivante: un programme A.py (s on
vrai nom est latexbd.py, voir lien ci-dessous) exécute du code en
prenant ses données dans un fichier F.tex. Bien que mon code python soit
surement très mauvais, cela marche extrèmement bien, mais je voudrais maintenant
inclure directement des lignes de code et là je bute:

- première idée lire les lignes dans F.tex et les exécuter.

- deuxième idée, écrire les lignes dans un fichier B.py puis inclur e ce
fichier dans A.py.

La première méthode semble vouée à l'échec mais je me trompe
peut-être. Je pensais que la seconde pouvait marcher mais je n'ai rien
trouvé de concluant dans la doc, j'ai peut-être mal cherché. J'ai e ssayé
execfile et import mais j'ai des erreurs car le code de B.py fait appel
à celui de A.py alors que ces commandes ne semblent pas le permettre.

Peut-on procéder comme je l'envisage? Dois-je changer de stratégie?
Merci pour votre aide.

Etienne

http://perso.orange.fr/Etienne.Marache/latex/lbd/latexbd.html


Bonjour,

Je ne suis pas sûr de comprendre ce que tu veux dire par "je voudrais
maintenant inclure directement des lignes de code"

J'essaie de reformuler :
- tu as du code Python quelque part dans un fichier .tex
- dans ton programme a.py tu veux lire ce code et l'exécuter

Si c'est ça ce que tu appelles "la première méthode" marche bien. Il
suffit de faire dans a.py :

code_python = (extraction de la partie utile du fichier tex)
exec code_python

N'hésite pas à relancer si j'ai compris de travers
Pierre

Avatar
MCI, Shadok Gouroudoudou
Bonjour !

Pour inclure du code "externe" dans un script en cours, il y a bien sûr
l'instruction import

Mais, si l'on modifie le fichier source, une nouvelle utilisation de
import ne fera rien, car le module est déjà chargé.
Il faut alors utiliser reload() (voir le doc).


Une autre possibilité, c'est execfile(). Avantage, on peut utiliser un
nom de fichier quelqueconque.
Note : il est préférable d'utiliser la forme :
execfile(cheminfichier, globals(), globals())
qui précise l'environnement d'exécution.


Troisième piste : eval(chaine) ; là, on va mettre le code-source dans
une chaîne de caractères, puis on va l'exécuter.
Avantage, on peut modifier le chaîne en mémoire, et la réexécuter.
Là aussi, la forme eval(source, globals(), globals()) est à considérer.

Dernière piste, pour aujourd'hui : compile + exec
Comme précédemment, on met le code-source dans une chaîne. Mais, on
force la compilation par Python, ce qui retourne un objet-code, que
l'on peut exécuter. Exemple :
import sys
try:
ccod=compile(chainesource,'mon_code_source:','exec')
flagcompile=True
except:
print "Erreur de compilation"
flagcompileúlse
if flagcompile==True:
try:
exec(ccod,globals(),globals())
except:
tb=sys.exc_info()[2] #traceback
print str(sys.exc_info()[0]),traceback.format_exc()

Tel que c'est traité dans l'exemple, on a l'avantage d'avoir un
contrôle de la syntaxe, et une information sur les erreurs éventuelles.



On pourrait déblatérer pendant de nombreux paragraphes, sur les façons
de faire décrites, ou sur d'autres.
Néanmoins, cela devrait te permettre d'avancer dans le direction qui te
plaît...






--
@-salutations

Michel Claveau
Avatar
Etienne Marache
MCI, Shadok Gouroudoudou writes:

Tout d'abord grand merci pour ces deux réponses


Bonjour !

Pour inclure du code "externe" dans un script en cours, il y a bien
sûr l'instruction import


Une autre possibilité, c'est execfile(). Avantage, on peut utiliser un
nom de fichier quelqueconque.
Note : il est préférable d'utiliser la forme :
execfile(cheminfichier, globals(), globals())
qui précise l'environnement d'exécution.


Pour ces deux méthodes, je suis très perplexe, lorsque je les avais
essayé avant d'écrire mon message, j'avais des erreurs car python
exécutait le contenu sans tenir compte du fichier principal.

Maintenant je n'ai plus d'erreur mais le contenu n'est plus exécuté.

Au tennis, on casse sa raquette, mon ultra-portable se fait tout petit!



Troisième piste : eval(chaine) ; là, on va mettre le code-source dans
une chaîne de caractères, puis on va l'exécuter.
Avantage, on peut modifier le chaîne en mémoire, et la réexécuter.
Là aussi, la forme eval(source, globals(), globals()) est à considérer.

Dernière piste, pour aujourd'hui : compile + exec
Comme précédemment, on met le code-source dans une chaîne. Mais, on
force la compilation par Python, ce qui retourne un objet-code, que
l'on peut exécuter. Exemple :
import sys
try:
ccod=compile(chainesource,'mon_code_source:','exec')
flagcompile=True
except:
print "Erreur de compilation"
flagcompileúlse
if flagcompile==True:
try:
exec(ccod,globals(),globals())
except:
tb=sys.exc_info()[2] #traceback
print str(sys.exc_info()[0]),traceback.format_exc()

Tel que c'est traité dans l'exemple, on a l'avantage d'avoir un
contrôle de la syntaxe, et une information sur les erreurs éventuelles.



Bon là ça va beaucoup mieux, (sauf traceback.format_exc()), je peux déjà
avancer avec cette méthode. Y a-t-il une limite à la longueur de la
chaîne?

Merci encore,

Etienne

Avatar
MCI, Shadok Gouroudoudou
Re !

Y a-t-il une limite à la longueur de la chaîne?


J'ai testé avec des chaines de 10Mo sans problèmes ; ça fait quand même
10 millions de caractères ! En pratique, je dépasse rarement 30 ko,
avec des pointes à 100-200 ko, alors que la plupart des chaînes font
entre 30 et 200 caractères.

Pour info, j'utilise souvent cette technique pour faire du Python à
partir d'autres applications/langages, via un serveur COM en Python.
Je me suis un peu plus intéressé aux performances. Ainsi, ça fonctionne
avec plusieurs milliers d'appels par secondes, mais, pour 10 Mo, il
faut 5 ou 6 secondes...

J'ai une autre utilisation, encore en gestation, qui consiste à
intégrer développement et application, ce va permettre de modifier des
(conception d') écrans, sans sortir de l'application, mais nécessite
que le script puisse se modifier lui-même.


Je serais curieux de savoir pour quelle genre d'applications vous
envisagez ces techniques.



Pour le traceback, je n'ai pas précisé, mais il faut un
import traceback
préalable...













--
@-salutations

Michel Claveau

Avatar
Etienne Marache
MCI, Shadok Gouroudoudou writes:

Re !

Y a-t-il une limite à la longueur de la chaîne?


J'ai testé avec des chaines de 10Mo sans problèmes ; ça fait quand
même 10 millions de caractères ! En pratique, je dépasse rarement 30
ko, avec des pointes à 100-200 ko, alors que la plupart des chaînes
font entre 30 et 200 caractères.


Bon en entrée avec au plus quelques dizaines de lignes de code, ce sera
confortable.


Pour info, j'utilise souvent cette technique pour faire du Python à
partir d'autres applications/langages, via un serveur COM en Python.
Je me suis un peu plus intéressé aux performances. Ainsi, ça
fonctionne avec plusieurs milliers d'appels par secondes, mais, pour
10 Mo, il faut 5 ou 6 secondes...

J'ai une autre utilisation, encore en gestation, qui consiste à
intégrer développement et application, ce va permettre de modifier des
(conception d') écrans, sans sortir de l'application, mais nécessite
que le script puisse se modifier lui-même.


Je serais curieux de savoir pour quelle genre d'applications vous
envisagez ces techniques.

Merci de t'intéresser à mes problèmes, d'ailleurs un petit avis même

superficiel me serait très profitable, je me suis lancé sans rien
connaître à Python comme tu as pu t'en rendre compte. Mon programme
marche bien mais d'un point de vue programmation, je fais peut-être
d'énormes erreurs. Pour placer le cadre il s'agit d'utiliser des données
provenant de bases (postgres, mysql ou autre) dans des documents. Pour
la partie données j'utilise SQLAlchemy (sans trop comprendre) et pour la
partie présentation LaTeX (là je suis beaucoup plus à l'aise). Voici
l'adresse du programme qui fonctionne seul ou plutôt appelé par un
script bash.

http://perso.orange.fr/Etienne.Marache/latex/lbd/latexbd.py

L'idée est que l'utilisateur lance la partie python et la partie latex
depuis un seul fichier source de type latex, les instructions python
étant déguisées en commandes et environnements latex, ceci parce que le programme
s'adresse à des utilisateurs de latex qui ont l'habitude de travailler
ainsi.

Ceci pour expliquer que je voudrais créer un nouveau
pseudo-environnement latex dans lequel il n'y aurait que des commandes
python et ces commandes seraient injectées dans le fichier
latexbd.py. Je pensais au départ que import ou execfile répondaient à
mes besoins mais cela a l'air plus compliqué.

D'ailleurs même avec la méthode du exec sur la chaîne j'ai un problème,
je n'arrive pas à écrire dans un fichier, la méthode write semble
désactivée: open(fichier,'w').write('quelque-chose') ne provoque pas
d'erreur mais n'écrit rien.


Pour le traceback, je n'ai pas précisé, mais il faut un
import traceback
préalable...


ok, je me doutais qu'il manquait qqchose.


Merci encore
Etienne


Avatar
Laurent Pointal
Etienne Marache wrote:
Ceci pour expliquer que je voudrais créer un nouveau
pseudo-environnement latex dans lequel il n'y aurait que des commandes
python et ces commandes seraient injectées dans le fichier
latexbd.py. Je pensais au départ que import ou execfile répondaient à
mes besoins mais cela a l'air plus compliqué.


Ton post m'a rappelé un de ceux de Gael Varoquaux sur la liste pythonfr, il
en a d'ailleurs fait une page ici:
http://gael-varoquaux.info/computers/pyreport/index.html

Au cas où ça pourrais aider... il y a peut-être des éléments similaires dans
vos problématiques.

Avatar
Etienne Marache
Laurent Pointal writes:

Etienne Marache wrote:
Ceci pour expliquer que je voudrais créer un nouveau
pseudo-environnement latex dans lequel il n'y aurait que des commandes
python et ces commandes seraient injectées dans le fichier
latexbd.py. Je pensais au départ que import ou execfile répondaient à
mes besoins mais cela a l'air plus compliqué.


Ton post m'a rappelé un de ceux de Gael Varoquaux sur la liste pythonfr, il
en a d'ailleurs fait une page ici:
http://gael-varoquaux.info/computers/pyreport/index.html

Au cas où ça pourrais aider... il y a peut-être des éléments similaires dans
vos problématiques.


Merci, pour l'indication, je vais regarder ce programme. A première vue,
il ne poursuit pas du tout le même but que moi. Si j'ai bien compris
c'est plutôt le contraire, il part d'un fichier python et utilise des
outils de translation en latex. En ce qui me concerne, l'idéal serait de
n'utiliser que du latex dont rien ne peut remplacer la qualité
typographique (une translation automatique ne peut pas générer du code
de qualité). Malheureusement latex est assez lent de nature, alors si on
le fait calculer ou gérer des bases de données c'est catastrophique,
aussi mon idée est de déléguer à un logiciel de base de données tout ce
qui est stockage et traitement de données un peu comme
pstricks délègue la partie dessin à postscript. J'ai choisi python un
peu par hasard mais surtout à cause de psycopg et sqlalchemy. D'autre
font des choses analogues avec perl, avec ...

Quant à la liste, aurais-tu un lien pour les archives?

Merci, Etienne.


Avatar
Laurent Pointal
Quant à la liste, aurais-tu un lien pour les archives?


Le lien vers la liste:
https://www.aful.org/wws/info/python

Et celui vers les archives:
https://www.aful.org/wws/arc/python


Le post de Gaël:
https://www.aful.org/wws/arc/python/2006-06/msg00006.html


A+

Laurent.

Avatar
Etienne Marache
Laurent Pointal writes:

Quant à la liste, aurais-tu un lien pour les archives?


Le lien vers la liste:
https://www.aful.org/wws/info/python

Et celui vers les archives:
https://www.aful.org/wws/arc/python


Le post de Gaël:
https://www.aful.org/wws/arc/python/2006-06/msg00006.html



Merci beaucoup pour ces liens, le fil en question est effectivement
sur mon problème dirait-on. Il faudrait que par l'intermédiaire du exec,
python interprète le code exactement comme s'il faisait partie du
fichier principal. C'est le cas avec la solution de Michel pour toutes
les instructions que j'ai essayé (pas beaucoup) sauf pour le
open(fichier,'w').write qui laisse python de marbre.

Etienne