我正在尝试创建一个简单的脚本来通过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”会得到与从我的脚本中调用它时不同的结果。
答案 0 :(得分:1)
最可能的罪魁祸首是unison正在向stderr发送一些输出而不仅仅是stdout。 Popen需要额外的stderr
参数,因此您可以尝试捕获它而不是(或除了)stdout。
有关standard streams的快速参考,请参阅Wikipedia。
答案 1 :(得分:0)
将[“unison”,“sync”]更改为简单[“unison sync”] ...现在似乎无需用户交互,不知道为什么会有任何不同...但对我有用