之前写了个小脚本,在控制台一次性输入多行文本,用input()接收,再用split('\n')分割存入列表,在开发环境下运行正常,在用户机器上无法正常运行,只能接受到第一行文本。
一次性输入的多行文本指的是类似图中这样的,直接复制粘贴进控制台:
经过排查发现如下坑点:
- 在Pycharm的run控制台中用input()无法接收完整的'a\nb\nc',只能接收到第一个a,即读到第一个\n就自动结束输入了,无法正确接收换行。
- 在Python Console中则可以正常接收一次性输入的多行文本,再用一次回车结束输入。
- 用sys.stdin.read()则可以实现在Pycharm的Run控制台中接收完整的多行文本(本质是能接受换行\n)。
由于我的开发环境配置了Anaconda,Pycharm自动套用了“Run with Python Console”的运行配置,而Pycharm默认的项目构建方式是Virtualenv,默认用的是Pycharm内建控制台Run,所以一直没有发现这个小问题。
切换Run控制台和Python Console的方法:
右键点击标签:
在Execution中的Run with Python Console:
最后话不多说,上测试代码:
import sys
list1 = []
s1: str
list2 = []
s2: str
# 同时输入多行(复制粘贴进去):
# a
# b
# c
# 在pycharm的run控制台中用input无法接收完整的'a\nb\nc' 只能接收到第一个a 即读到第一个\n就自动结束了 无法正确接收换行
# 在python console中则可以正常接收一次性输入的多行文本 再用一次回车结束输入
def inputUrls():
global list1, s1
s1 = input()
list1 = s1.split('\n')
# 用sys.stdin.read()则可以实现在pycharm的run控制台中接收完整的多行文本(本质是能接受换行\n)
# 需要用Ctrl+D结束输入
def inputSys():
global list2, s2
s2 = sys.stdin.read()
list2 = s2.split('\n')
# 开关 想用哪个用哪个
if 1 == 0:
inputUrls()
print(s1)
print(list1)
if 1 == 0:
inputSys()
print(s2)
print(list2)