【发布时间】:2011-11-14 05:06:15
【问题描述】:
为了我自己的乐趣,我编写了一个 python 脚本,它允许我将 python 用于 bash 单行;提供一个 python 生成器表达式;并且脚本对其进行迭代。这是脚本:
DEFAULT_MODULES = ['os', 're', 'sys']
_g = {}
for m in DEFAULT_MODULES:
_g[m] = __import__(m)
import sys
sys.stdout.writelines(eval(sys.argv[1], _g))
这就是你可以如何使用它。
$ groups | python pype.py '(l.upper() for l in sys.stdin)'
DBORNSIDE
$
对于预期用途,它可以完美运行!
但是当我不使用管道输入它并直接调用它时,例如:[强调显示我输入的内容]
$ python pype.py '("%r\n" % (l,) for l in sys.stdin)' foo输入 栏输入 baz输入 Ctrl DCtrl D'foo\n' '谷仓' '巴兹\n' $为了停止接受输入并产生任何输出,我必须输入 Enter - Ctrl D - Ctrl D 或 Ctrl D - Ctrl D - Ctrl D。这违背了我的期望,每一行都应该按输入进行处理,并且在任何时候键入 Ctrl D 都会结束脚本。我的理解差距在哪里?
编辑:我已经更新了交互式示例,以表明我没有看到 wim 在他的回答中描述的引用,以及更多示例。
$ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooCtrl DCtrl DbarEnter Ctrl DCtrl D'foobar\n' $ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooCtrl VCtrl D^DbarEnter Ctrl DCtrl D'foo\x04bar\n' $【问题讨论】:
-
为我工作(OS X 10.5、Python 2.5 和 3.2)。
-
根据我的经验,您所描述的行为正是我所期望的——违反预期的行为正是您所期望的。所描述的行为是我在 Linux 和 Mac OS 机器中一直得到的。 (除了双 Ctrl D - 我只需要输入一次(如果在新的空行上)或两次(如果当前行有一些内容)。
-
@brandizzi:括号中的那位正是我所说的。我还对在处理任何输入之前输入多行这一事实感到困惑,但这是次要的问题。
-
@TokenMacGuy 我想知道你为什么也得到它,特别是因为我无法重现它。你的操作系统是什么?另外,你用的是什么外壳?
-
看起来这是某些 python 版本的已知问题;我将不得不解决它。