我正在用kivy编写pythonui来使用fabric管理一些远程机器。由于我不能在Windows10上使用fabric的并行实现(请参见here),所以我希望使用并行ssh来实际执行并行远程操作。这个问题似乎是由库之间的交互引起的,而不是它们中任何一个的问题。在
我已尝试按建议手动加载私钥here:
from fabric.api import execute
import pssh
from pssh.utils import load_private_key
hosts = ['192.168.0.2']
private_key = load_private_key('C:/Users/democracy/.ssh/id_rsa')
pssh_client = pssh.ParallelSSHClient(hosts, user='XXX', password='YYY', pkey=private_key)
output = pssh_client.run_command('whoami', sudo=True)
pssh_client.join(output)
for host in output:
for line in output[host]['stdout']:
print("Host %s - output: %s" % (host, line))
以上代码将导致以下回溯:
^{pr2}$如果我在fabric之前导入pssh,那么上面的代码可以工作。不幸的是,如果我这么做的话,我的kivy界面上的任何按钮(在后台线程中启动任何操作)似乎永远都会被按下。如果我在按下按钮后进入控制台并发送一个键盘中断,kivy停止阻塞并开始清理,但是在退出之前从按钮按下执行命令。发送此中断时的stacktrace如下:
[INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "machine_control_ui.py", line 7, in <module>
DemocracyControllerApp().run()
File "C:\environments\democracy\lib\site-packages\kivy\app.py", line 828, in run
runTouchApp()
File "C:\environments\democracy\lib\site-packages\kivy\base.py", line 504, in runTouchApp
EventLoop.window.mainloop()
File "C:\environments\democracy\lib\site-packages\kivy\core\window\window_sdl2.py", line 659, in mainloop
self._mainloop()
File "C:\environments\democracy\lib\site-packages\kivy\core\window\window_sdl2.py", line 405, in _mainloop
EventLoop.idle()
File "C:\environments\democracy\lib\site-packages\kivy\base.py", line 339, in idle
Clock.tick()
File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 553, in tick
current = self.idle()
File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 533, in idle
usleep(1000000 * sleeptime)
File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 717, in usleep
_usleep(microseconds, self._sleep_obj)
File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 395, in _usleep
_kernel32.WaitForSingleObject(obj, 0xffffffff)
keyboardInterrupt
*** BUTTON PRESS OPERATION OUTPUTS HERE ***
```
如果能深入了解为什么会发生这种情况,以及我如何避免这种情况,我将不胜感激。我可以研究其他并行ssh解决方案(尽管我认为使用paramiko的任何东西都会有相同的问题),或者手动启动每个主机的一个线程来实现并行操作(这可能有它自己的一系列令人头痛的问题),但是如果有可行的解决方案,我更愿意使用并行ssh库。在
我在python3和windows10上使用并行ssh0.92.2。在
从docs-
由于monkey patching用于您正在使用的客户机,因此应用程序中
threading
、socket
等模块的其他用法也将被修补为使用gevent,这意味着它们不再在本机线程中运行,而是在co-routine/greenlet中运行。在这就是后台线程操作在同一线程(而不是新线程)上以greenlet运行时阻塞的原因。在
从
1.2.0
起,基于libssh2
而不是paramiko的新客户机可用,它不使用monkey patching:然后,应用程序的其余部分可以按原样使用标准库。在
相关问题 更多 >
编程相关推荐