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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top