Bonjour,
Dans le cadre d'un projet en R, je dois utiliser un package pour faire du multithreading: netWorkSpaces. Ce package repose sur du code Python, et là j'y connais plus rien.
Le hic avec ce genre de fonctionnement, c'est que le moteur démarre N instances de R ("workers") mais il ne récupére que les sorties finales, pas les intermédiaires (typiquement, les "printf" ou autre "cat"), utiles au traçage du programme. Pour comprendre mon problème, voici rapidement l'architecture:
Programme R
|
package nws / classe Sleigh
|
BackgroundLaunch.py qui lance N fois "Python RNWSleighWorker.py" via CreateProcess
|
Chaque script RNWSleighWorker.py lance une instance de R via subprocess.popen
Cette architecture n'est pas modifiable et indépendante de ma volonté.
Une solution basique est d'aller modifier le script python pour afficher une fenétre avec le processus. Pour cela, j'ai juste modifié une ligne dans RNWSleighWorker.py:
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 p = subprocess.Popen(argv, stdin=open(tmpname), stdout=out, stderr=subprocess.STDOUT)
Cela a pour effet d'afficher les N terminaux R enfant. Mais ces N terminaux restent désepèrement vides (cf pièce jointe)!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 p = subprocess.Popen(argv, stdin=open(tmpname), stderr=subprocess.STDOUT, creationflags = win32process.CREATE_NEW_CONSOLE)
Certes, l'argument "stdout" de subprocess.popen n'est pas assigné et donc est probablement mis à None. Mais si:
- stdout = subprocess.STDOUT , alors la fenêtre fille n'est tout simplement pas lancée et il semble que Python perde la main sur le programme.
- stdout = subprocess.PIPE : aucun changement (ça se lance mais n'affiche rien)
- stdout = un handle sur fichier: ça fonctionne!
Bref, quelque chose me fait dire que c'est ma méconnaissance du Python qui me bloque et m'empêche d'assigner la bonne valeur à stdout. Obtenir le comportement de base reste étonnament difficile...
Merci
Cordialement
Partager