如何将数据通过管道传入IPython并在执行命令后保留交互会话
解决方案
故障原因
你遇到的两个问题都是标准输入(stdin)流向异常导致的:
- 直接使用管道时,IPython会默认将管道传入的内容识别为待执行的Python代码,而非命令行参数,所以你的CSV数据会被当成代码执行触发语法错误,内容传输完成后stdin到达EOF,IPython直接触发退出流程回到shell。
- 使用
xargs虽然能把管道内容转成正确的命令行参数,但此时IPython的stdin仍然绑定到已关闭的管道上,检测不到可交互的输入流,也会自动触发退出。
可用实现方案
方案1:先捕获管道输出为变量再调用IPython
这是兼容性最好、最易用的方案,不需要额外工具,所有shell环境都支持:
# 先把上游管道的输出存到变量中 DATA=$(echo "my,test,csv\n1,2,3") && ipython -i -c "import sys; print(sys.argv[-1])" "$DATA"
原理是完全不修改IPython的stdin绑定,IPython始终和当前交互终端的输入流绑定,执行完指定代码后会正常停留在交互会话中。
方案2:xargs搭配终端重定向直接使用管道
如果不想额外定义变量,可以在调用IPython时主动把stdin重定向到当前交互终端:
echo "my,test,csv\n1,2,3" | xargs -0 sh -c 'ipython -i -c "import sys; print(sys.argv[-1])" "$0" < /dev/tty'
这里的< /dev/tty会把IPython的输入流重新绑定到当前的终端交互接口,即使上游管道关闭也不会触发自动退出。
内容的提问来源于stack exchange,提问作者mwaskom
相关产品推荐
相关产品推荐

