本文来自依云's Blog,转载请注明。
rpysh 是为习惯 Linux 的 Pythoners 在不得不处理 Windows 上的事务时写的远程 shell。
源起
前些天,我尝试了使用 Python 控制 Word。但我对 Windows 下的交互式 Python shell 很不满意。
首先,我尝试的是 cmd.exe 那个黑窗口。太难用了!只有最基本的行编辑、在不知不觉中历史记录被窜改、复制粘贴极其麻烦。补全当然也是没有的。
于是,尝试 IDLE。这家伙我选了「IDLE Classic Unix」,但是能工作的键并不多。比如我刚刚尝试的Ctrl-u就不管用。而Ctrl-p竟然是把光标向上移动,回车才会把那行的内容取到输入命令的那行。这样一来,想再次执行最后一条语句,需要视上条命令输出的行数按几下Ctrl-p。另外,鼠标在窗口内点击后光标会被移开。这样,我使用鼠标从其它窗口切回来时,还得再手动定位光标,极其不爽。至于补全么,太智能了,所以在我输入时不时会出现这种情况:
还有一个问题:我查资料、做笔记、写代码都在 Linux 上,虽然Ctrl-C、Ctrl-V在物理机和虚拟机间能够无缝操作,但比起选中+中键粘贴的 X 主选区还是麻烦多了!
没办法,我只好重拾很久以前的想法——写个程序,在 Linux 上操作,在 Windows 上执行!
——等等!这和 ssh 差不多吗?或者 telnet?
——不不,Cygwin 的 ssh 跑不了 Windows 控制台程序,而且,不还是没 readline 支持么?
实现
毫无疑问是网络通信了。距离上一次不成功的尝试已经过去很久了,我不仅更加了解了code
模块的能力,也知道 Python 命令行补全是怎么回事了。也就是说,Windows 版的 Python 是有补全的接口的,只是没有 readline 的等价物来调用。跑在 Windows 上的服务端要完成以下操作:
- 重写相关方法,把用户数据由标准输入改到从客户端读取
- 标准输出重定向到网络 socket
-
收到客户端的补全请求后,使用
rlcompleter
模块获取补全结果,再回送给客户端
对于第一点,实际上取代code.InteractiveConsole
实例的raw_input
方法就行。它和内建的input()
函数具有相同的输入和输出形式,也就是会接收命令提示符。将这个直接发给客户端好了。
第二点很简单,直接socket.makefile
然后把sys.stdout
指过去。
第三点,为了简单起见,我另开了个线程和 socket,专门用于补全。需要传递的参数和返回值全部 pickle 了扔给对方就是了。
写完这些我才发现,其实我的raw_input
方法和补全函数具有相似的执行逻辑:发送参数到网络,再从网络获取执行结果——也就是远程过程调用呵。
使用方法
rpyshd.py
可选一个参数作为端口号,为方便起见,提供默认值8980
。也是为了方便双击执行起见,我添加了.py
后缀。
rpyshc
相当于telnet
命令了,直接接主机地址和端口号两个参数即可。
缺陷
- 从标准输入读数据时在服务端
- 偶尔提示符出现不及时
- 虽然我实现了Ctrl-C,但是实际上没什么用,因为收到消息时之前的操作肯定已经执行完了
Jun 13, 2012 04:44:08 PM
使用方法稍微写详细点
我初一看都没看大明白干嘛的这个东东
Jun 13, 2012 05:08:04 PM
唉,懒了呗。我以后再注意下啦。
Sep 19, 2012 03:48:46 PM
喵呜, 为什么想不开去用win了..
Sep 19, 2012 04:16:17 PM
因为得用 Word 啊……
Sep 20, 2012 09:59:25 AM
5555 用word, 难道openoffice,和永中还满足不了你么.. 仙子君,
Sep 20, 2012 11:49:21 AM
是满足不了学校。
Oct 16, 2012 02:40:03 PM
还是建议您详细说说这个功能,或者写个例子,当然我也在自己尝试不过我不懂python 但是我觉得你的问题我也同样需要解决。
Oct 16, 2012 03:55:51 PM
这是个软件啊,又不是程序库,写什么例子。你试试看就知道了嘛。
不懂 Python 的话那你需要解决的问题是什么呢?
Oct 20, 2012 12:04:01 AM
谢谢,最近在一点点学习Python, 至于问我想解决什么问题吗?我想在Windows 上体验使用bash的感觉,虽然有cygwin 不过感觉很假很多东西反映也慢,你提到的这个软件似乎让我觉得可以借助python来实现些东西。
Oct 20, 2012 10:26:33 AM
Cygwin 慢没办法。用 SUA/Interix 也许会好一些。不过你为什么要「在Windows 上体验使用bash的感觉」呢?直接装 Linux 不就好了吗?
Oct 20, 2012 10:28:16 PM
因为办公环境要求使用Windows 公司的规定,如果是我自己选择的话 我会选在直接使用Linux 。