2 votes

pourquoi jsmin s'arrête-t-il prématurément lorsqu'il est exécuté dans un sous-processus python ?

J'ai téléchargé et compilé jsmin.c, et je l'ai exécuté sur un fichier javascript depuis le terminal, et cela semble fonctionner parfaitement. Mais lorsque je l'appelle à partir d'un appel os.system() ou os.popen() dans un script python (sur le même fichier d'entrée), le fichier de sortie (la version minifiée du fichier js) est tronqué, comme si stdout n'était pas vidé avant que le sous-processus ne se termine, ou comme si jsmin se terminait prématurément, ou comme si quelque chose se passait avec la mise en mémoire tampon du disque ou autre.

Mais aucune de ces choses ne semble être le cas. La valeur de sortie est celle que je renvoie depuis main() même si la sortie est tronquée, et ajouter un appel à fflush(stdout) ne fait aucune différence, et appeler sync depuis le même sous-shell après avoir appelé jsmin ne fait aucune différence.

J'ai essayé de remplacer les appels à putc() par des appels à fputc(), et au début il semblait que cela avait réglé le problème (pour une raison insondable ?), mais ensuite, inexplicablement, le problème a recommencé à se produire, et maintenant il se produit de manière fiable. Bizarre ?

Je dirais qu'il s'agit d'un problème avec jsmin.c, mais le programme fonctionne bien avec le même fichier d'entrée lorsqu'il est exécuté depuis la ligne de commande, donc cela a quelque chose à voir avec l'exécution depuis un sous-processus python.

Voici l'appel de mon sous-processus :

result = os.system('jsmin < ' + tpathname + ' > ' + tpathname + '.min')

(J'ai mis jsmin dans le chemin, et il fonctionne, j'obtiens la plupart des résultats attendus dans le fichier .min).

Quelqu'un peut-il imaginer ce qui pourrait causer ce problème ?

0voto

Shavais Points 366

Stack Overflow ne m'a pas laissé répondre à ma propre question pendant 5 heures ou quelque chose comme ça, donc cette 'réponse' a été ajoutée à l'origine comme une modification. (Il ne me laissait pas non plus chatter, donc les commentaires se sont allongés un peu).

J'ai trouvé le problème. Le problème venait du programme python qui créait le fichier d'entrée pour jsmin et appelait ensuite jsmin. Il créait un fichier, ne le fermait pas (encore), et appelait ensuite jsmin. Ainsi, jsmin ne se terminait pas prématurément, et sa sortie n'était pas tronquée ; il opérait plutôt sur un fichier d'entrée (encore) incomplet. (Duh.)

Je m'en serais rendu compte bien plus tôt que je ne l'ai fait, sauf que le programme python a fini par fermer le fichier d'entrée de jsmin (en sortant), de sorte qu'au moment où je l'examinais, il semblait complet. C'est juste qu'il n'était pas complet au moment où jsmin le traitait.

C'est d'ailleurs l'une des motivations de l'idiome "avec" :

with open(targetpath, 'w+') as targetfile:
   ..code that writes to targetfile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X