1

我正在尝试制作一个简单的脚本来通过 Unison 自动化和记录同步。我也使用 subprocess.Popen 而不是通常的 os.system 调用,因为它已被弃用。在过去的 2 天里,我一直在查看文档等,试图找出我做错了什么,但是由于某种原因,如果我从终端调用 unison,它就没有问题,但是当我从 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”会得到与从我的脚本中调用它时不同的结果。

4

2 回答 2

1

最可能的罪魁祸首是一致将一些输出发送到标准错误,而不仅仅是标准输出。Popen 需要一个额外的stderr参数,因此您可以尝试捕获它而不是(或除了)stdout)。

有关标准流的快速参考,请参阅Wikipedia

于 2009-10-21T18:12:51.147 回答
0

将 ["unison", "sync"] 更改为 ["unison sync"]...现在似乎无需用户交互即可工作,不知道为什么会有任何不同...但对我有用。

于 2009-10-21T18:40:29.007 回答