Problèmes de scripting Unison avec Python
Question
J'essaie de créer un script simple pour automatiser et consigner la synchronisation via Unison. J'utilise également subprocess.Popen plutôt que l'appel habituel os.system, car il est obsolète. J'ai passé les deux derniers jours à regarder des documents et autres pour essayer de comprendre ce que je faisais mal, mais pour une raison quelconque, si j'appelle à l'unisson depuis un terminal, cela ne pose aucun problème, mais lorsque je fais le même appel depuis Python, tente d'interagir avec l'utilisateur. En outre, je ne capture pas mais environ la moitié de la sortie, l'autre est toujours en cours d'impression sur le terminal.
Voici le code que j'essaie d'utiliser:
sync = Popen(["unison", "sync"], shell = True, stdout = PIPE)
for line in sync.stdout
logFile.write(line)
sync.wait()
if sync.returncode == 0 or sync.returncode == None:
logFile.write("Sync Completed Successfully\n")
else
logFile.write("!! Sync Failed with a returncode of: " + str(sync.returncode) + "\n")
Voici mon fichier de configuration Unison:
root = /home/zephyrxero/temp/
root = /home/zephyrxero/test/
auto = true
batch = true
prefer = newer
times = true
owner = true
group = true
retry = 2
Qu'est-ce que je fais mal? Pourquoi toutes les sorties de Unison ne sont-elles pas enregistrées dans mon fichier journal et pourquoi me demande-t-il de confirmer le moment où le script est exécuté, mais pas lorsque je le lance simplement à partir d'un terminal?
MISE À JOUR: Ok, grâce à Emil, je suis en train de capturer toute la sortie, mais je ne comprends toujours pas pourquoi il faut taper "unison sync". dans un terminal obtient des résultats différents de ceux obtenus lors de l'appel de mon script.
La solution
Le coupable le plus probable est que l'unisson envoie une sortie à stderr au lieu de stdout. Popen prend un argument supplémentaire stderr
afin que vous puissiez essayer de capturer cela au lieu de (ou en plus de) stdout).
Pour une référence rapide sur les flux standard , voir Wikipedia .
Autres conseils
Changé ["unison", "sync"] pour simplement ["unison sync"] ... semble fonctionner sans nécessiter d'interaction de l'utilisateur à présent, ne sachant pas pourquoi ce serait si différent ... mais travaille pour moi.