管道输出命令到交互式python会话?

时间:2010-02-23 08:37:03

标签: python redirect pipe interactive ipython

我想做的是像

 $echo $PATH | python --remain-interactive "x = raw_input().split(':')"
 >>>
 >>> print x
 ['/usr/local/bin', '/usr/bin', '/bin']

我认为ipython解决方案是最好的。如果这是不可能实现的,那么对于我想要处理来自各种其他命令的输出的情况,您的解决方案是什么?我在绝望之前曾经使用过子进程,但这并不理想。

更新:所以这更接近最终结果:

 echo $PATH > /tmp/stdout.txt; ipython -i -c 'stdout = open("/tmp/stdout.txt").read()'

现在我们怎样才能将其折叠成一种形式

 echo $PATH | pyout

其中pyout是“解决我所有问题的神奇办法”。它可以是一个shell脚本,它编写管道输出,然后运行ipython。由于bp所说的相同原因,所做的一切都失败了。

3 个答案:

答案 0 :(得分:2)

在IPython中你可以这样做

x = !echo $$$$PATH

$的双重逃脱虽然很痛苦

你可以这样做我猜

PATH="$PATH"
x = !echo $PATH
x[0].split(":")

答案 1 :(得分:1)

您正在寻找的--remain-interactive开关是-i。您还可以使用-c开关指定要执行的命令,例如__import__("sys").stdin.read().split(":")。所以你要尝试的是:(不要忘记逃避字符串!)

echo $PATH | python -i -c x = __import__(\"sys\").stdin.read().split(\":\")

然而,这就是所有显示的内容:

>>>

那为什么不起作用?因为你是管道。 python intepreter试图以交互方式读取来自您正在读取参数的sys.stdin的命令。由于echo已完成执行,sys.stdin已关闭,无法再进行任何输入。

出于同样的原因,例如:

echo $PATH > spam
python -i -c x = __import__(\"sys\").stdin.read().split(\":\") < spam

......会失败。

我要做的是:

echo $PATH > spam.bar
python -i my_app.py spam.bar

毕竟,open("spam.bar")是一个文件对象,就像sys.stdin一样:)

答案 2 :(得分:0)

由于Python的公理“应该有一个 - 最好只有一个 - 显而易见的方法”,我有理由相信没有比{{3}更好的方式与其他进程交互}。

如果您能说出以下“不理想”的原因,可能会有所帮助:

>>> process = subprocess.Popen(['cmd', '/c', 'echo %PATH%'], stdout=subprocess.PIPE)
>>> print process.communicate()[0].split(';')

(在您的具体示例中,您可以使用the subprocess module,但我意识到这并不是您所要求的。)