Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python编写Unison脚本时遇到的问题_Python_Unison - Fatal编程技术网

使用Python编写Unison脚本时遇到的问题

使用Python编写Unison脚本时遇到的问题,python,unison,Python,Unison,我正在尝试制作一个简单的脚本,通过Unison自动化和记录同步。我还使用subprocess.Popen,而不是通常的os.system调用,因为它已被弃用。在过去的两天里,我一直在看文档之类的东西,试图找出我做错了什么,但出于某种原因,如果我从终端调用unison,它不会出问题,但是当我从Python中调用相同的调用时,它会尝试进行用户交互,此外,我没有捕获到大约一半的输出,另一个仍在向终端打印 以下是我尝试使用的代码: sync = Popen(["unison", "sync"], she

我正在尝试制作一个简单的脚本,通过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”会得到与从脚本调用时不同的结果。

最可能的罪魁祸首是unison将一些输出发送到stderr,而不仅仅是stdout。Popen接受一个额外的
stderr
参数,因此您可以尝试捕获该参数,而不是(或除了)stdout)


有关快速参考,请参阅。

最可能的原因是unison将一些输出发送到stderr,而不仅仅是stdout。Popen接受一个额外的
stderr
参数,因此您可以尝试捕获该参数,而不是(或除了)stdout)


如需快速参考,请参阅。

将[“unison”,“sync”]更改为简单的[“unison sync”]…现在似乎可以在不需要用户交互的情况下工作,不知道为什么会有任何不同…但对我有效。

将[“unison”,“sync”]更改为简单的[“unison sync”]…现在似乎可以在不需要用户交互的情况下工作,不知道为什么会有什么不同……但对我来说很有效。

我以前试过piping stderr,但由于某种原因它似乎不起作用……可能是在我发现它正在等待输入之前……嗯……现在似乎正在捕获所有输出。我以前试过piping stderr,但由于某种原因,它似乎不起作用……可能是在我发现它在等待输入之前……嗯……现在似乎正在捕获所有的输出。