如何撤销`import readline`对Python内置函数的影响?
如何撤销Python2中readline模块对raw_input的影响
首先得搞清楚为什么del readline或者重新导入raw_input没用:当你导入readline模块时,它已经悄悄修改了sys.stdin.readline的实现,把它替换成了带GNU readline功能的版本——而raw_input()本质上是依赖这个方法来读取输入的。删除模块本身并不会把sys.stdin.readline改回原来的样子,重新导入raw_input也没用,因为raw_input本身没被替换,它还是会调用被修改后的sys.stdin.readline。
那正确的解决思路是提前备份原始的sys.stdin.readline,之后再恢复它,具体步骤如下:
在导入readline之前,先保存标准输入的原始readline方法:
import sys original_stdin_readline = sys.stdin.readline当你需要撤销readline的影响时,把保存的原始方法重新赋值给
sys.stdin.readline:sys.stdin.readline = original_stdin_readline
用你的测试命令验证的话,修改后应该是这样:
python2 -c "import sys; original_readline = sys.stdin.readline; raw_input(); import readline; raw_input(); sys.stdin.readline = original_readline; raw_input()"
执行这个命令后,第三次调用raw_input()就会恢复成最初的无readline增强的状态,箭头操作和历史记录都会失效。
另外,如果你没办法提前备份(比如readline是被其他模块间接导入的),也可以尝试从sys.__stdin__中获取原始的readline方法——sys.__stdin__是Python启动时保存的标准输入的原始对象,它的readline方法没被readline模块修改过:
import sys sys.stdin.readline = sys.__stdin__.readline
这个方法也能达到同样的恢复效果。
内容的提问来源于stack exchange,提问作者Enr1g
相关产品推荐
相关产品推荐

