“while read line”假设按下回车键,只执行一次迭代,但“for line in blah”工作正常

2024-04-19 10:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,我正在终端中执行。python脚本在后台执行一些操作,然后(使用原始输入)等待按下“enter”键,然后继续。你知道吗

为了简单起见,假设python脚本如下所示:

import sys
print 'PRESS ENTER'
a = raw_input()
print 'you wrote %s' %sys.argv[1]
print 'done'

为了在许多不同的变量上执行此脚本,我执行了以下操作:

macbookpro2:~$ echo '1
2
3
4
5
6
7
8
9' |while read line; do python test.py $line; done
PRESS ENTER
you wrote 1
done

它并没有遍历所有的数字,而且原始的输入似乎是在我没有采取任何行动的情况下为我按下的。。。你知道吗

在另一个方法中,每个方法都需要我的enter键,并正确执行:

macbookpro2:1 2 3 4 5 6 7 8 9中i的~$测试.py$i;完成 按回车键

you wrote 1
done
PRESS ENTER

you wrote 2
done
PRESS ENTER

you wrote 3
done
PRESS ENTER

you wrote 4
done
PRESS ENTER

you wrote 5
done
PRESS ENTER

you wrote 6
done
PRESS ENTER

you wrote 7
done
PRESS ENTER

you wrote 8
done
PRESS ENTER

you wrote 9
done

有人知道为什么会这样吗?你知道吗


Tags: 方法py脚本you终端sysline后台
1条回答
网友
1楼 · 发布于 2024-04-19 10:05:52

raw_input读取标准输入。在您的测试中,该输入是从运行脚本的循环继承的,因此它也从echo语句而不是键盘读取。另外,Python默认情况下使用缓冲输入;即使只有raw_input返回一行输入,Python仍将循环的其余输入读入内部缓冲区,以防再次调用raw_input。下次调用read时,就没有什么可读的了。你知道吗

通过使用-u选项关闭缓冲,可以得到不同的结果:

echo '1
2
3
4
5
6
7
8
9' | while read line; do python -u tmp.py $line; done
PRESS ENTER
you wrote 1
done
PRESS ENTER
you wrote 3
done
PRESS ENTER
you wrote 5
done
PRESS ENTER
you wrote 7
done
PRESS ENTER
Traceback (most recent call last):
  File "tmp.py", line 3, in <module>
    a = raw_input()
EOFError: EOF when reading a line

现在,raw_input仍在读取与read相同的输入“文件”,但保证只读取它将返回的一行。因此奇数由read命令读取,偶数服务器由Python脚本提示“ENTER”。要查看通过管道传输到循环中的每个数字,请为Python提供自己的标准输入:

echo '1
2
3
4
5
6
7
8
9' | while read line; do echo | python -u tmp.py $line; done
PRESS ENTER
you wrote 1
done
PRESS ENTER
you wrote 2
done
PRESS ENTER
you wrote 3
done
PRESS ENTER
you wrote 4
done
PRESS ENTER
you wrote 5
done
PRESS ENTER
you wrote 6
done
PRESS ENTER
you wrote 7
done
PRESS ENTER
you wrote 8
done
PRESS ENTER
you wrote 9
done

相关问题 更多 >