我正在尝试制作一个简单的脚本来通过Unison自动化和记录同步。我也使用subprocess.Popen而不是通常的os.system调用,因为它已被弃用。我花了过去两天的时间查看文档,并试图找出我做错了什么,但是由于某种原因,如果我从终端调用统一,那没问题,但是当我从Python进行相同的调用时,尝试进行用户交互,此外我没有捕获,但是大约一半的输出,其他仍在打印到终端。

这是我尝试使用的代码:

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")


这是我的Unison配置文件:

root = /home/zephyrxero/temp/
root = /home/zephyrxero/test/

auto = true
batch = true
prefer = newer
times = true
owner = true
group = true
retry = 2


我究竟做错了什么?为什么Unison的所有输出都没有保存到我的日志文件中,为什么它在脚本运行时要求我确认,而当我从终端简单地运行时却没有要求?

更新:
好的,感谢Emil,我现在捕获了所有输出,但是我仍然不知道为什么在终端中键入“ unison sync”与从脚本中调用它会得到不同的结果。

最佳答案

最有可能的罪魁祸首是一致地将一些输出发送到stderr,而不仅仅是stdout。 Popen带有一个附加的stderr参数,因此您可以尝试捕获该参数,而不是(或除了)stdout)。

有关standard streams的快速参考,请参见Wikipedia

10-07 13:37