python脚本在从stdin读取时卡住
出于某种原因,一个一直有效的脚本现在失败了:( 我进行了调查,并精简到最低限度,但仍然不起作用: 类别a.py:python脚本在从stdin读取时卡住,python,python-3.x,Python,Python 3.x,出于某种原因,一个一直有效的脚本现在失败了:( 我进行了调查,并精简到最低限度,但仍然不起作用: 类别a.py: import sys for row in sys.stdin.readlines(): print("hey") print(row) 测试: >> cat b.csv a,b,c 1,2,3 >> cat b.csv | python a.py // hangs for ever, if I Ctrl+C: for row in sys.st
import sys
for row in sys.stdin.readlines():
print("hey")
print(row)
测试:
>> cat b.csv
a,b,c
1,2,3
>> cat b.csv | python a.py
// hangs for ever, if I Ctrl+C:
for row in sys.stdin.readlines():
KeyboardInterrupt
知道会发生什么事吗?谢谢!经过调查,这似乎与我使用的别名有关 因为我有不同的python2和pytho3库
pythonpath2=/usr/local/lib/python2.7/site-packages
pythonpath3=~/Library/Python/3.6/lib/python/site-packages:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
alias p="unset PYTHONPATH; export PYTHONPATH=${pythonpath3}; python3.7"
alias p2="unset PYTHONPATH; export PYTHONPATH=${pythonpath2}; echo $PYTHONPATH; python"
因此,我猜在终端中进行管道传输之前,会将管道传输到别名的最后一个命令,并且更改使其传输到别名的第一个命令(unset),这使其无效无法复制。尝试时代码运行正常。如果运行
sys.stdin.readlines()
它会自己挂在外壳中。也许stdin
没有接收到任何字节?可能是因为您正在读取的文件没有EOF标记吗?一位同事问,我想我的计算机出了问题。安装了最新的python 3.7,但不起作用,不确定出了什么问题:(旁注:此处不应使用.readlines()
;这样做意味着如果stdin
是零碎的,您仍然必须等待它完全完成(并关闭)在您开始做任何工作之前。只需在sys.stdin:中的行上循环,就会像以前一样逐行处理,但只要stdin
上有完整的行可用,它就可以开始处理。即使输入源缓冲其输出,也会在有几KB的数据可用后开始处理,而不是毕竟数据可用,速度更快,响应速度更快,内存更友好。您可能应该使用类似于virtualenv
的东西,而不是自己尝试实现虚拟环境。此外,使用函数而不是别名的另一个原因是:函数中的每个命令都会继承函数的标准输入,w在这里,别名只有unset
会连接到管道。这也是显示您在帖子中运行的实际代码的另一个原因;有人会立即询问p
或p2
是什么。事实上,我们通常认为失败是理所当然的:)我将把它移动到一个函数中,我不知道输入是这样的