Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python脚本在从stdin读取时卡住_Python_Python 3.x - Fatal编程技术网

python脚本在从stdin读取时卡住

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

出于某种原因,一个一直有效的脚本现在失败了:( 我进行了调查,并精简到最低限度,但仍然不起作用:

类别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.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
是什么。事实上,我们通常认为失败是理所当然的:)我将把它移动到一个函数中,我不知道输入是这样的