使用Python编写Unison脚本的问题

1 投票
2 回答
1493 浏览
提问于 2025-04-15 15:15

我正在尝试写一个简单的脚本,用来自动化和记录通过Unison进行的同步。我使用的是subprocess.Popen,而不是以前常用的os.system,因为后者已经不推荐使用了。我花了两天时间看文档,试图弄清楚我哪里出错了,但奇怪的是,当我在终端直接调用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”和从我的脚本调用时结果会不一样。

2 个回答

0

把 ["unison", "sync"] 改成了简单的 ["unison sync"]...现在看起来可以正常工作了,不需要用户再去操作,具体为什么会有这样的变化我也不太清楚...不过对我来说是有效的。

1

最有可能的问题是,unison正在将一些输出发送到错误输出(stderr),而不仅仅是标准输出(stdout)。Popen有一个额外的stderr参数,你可以尝试捕获这个错误输出,或者同时捕获标准输出。

想了解更多关于标准流的信息,可以参考维基百科

撰写回答