2010-02-23 63 views
2

我想要做的是一样的东西将命令输出到交互式python会话?

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

我想IPython的解决方案是最好的。如果这是不可实现的,那么对于我想要处理来自其他各种命令的输出的情况,您将如何解决?当我绝望时,我已经使用子过程来做到这一点,但这并不理想。

UPDATE:所以这是越来越接近最终的结果:

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

现在我们怎么能去约弯曲到这个形式

echo $PATH | pyout 

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

回答

2

在IPython中,你可以做到这一点

x = !echo $$$$PATH 

$双逃避虽然

你能做到这一点我想

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

由于Python的公理“应该有一个 - 最好只有一个 - 明显的方式来做到这一点”我相当确定,除了the subprocess module之外,没有比其他进程更好的交互方式。

它可以帮助如果你能说说为什么像下面的“不理想”:

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

(在你的具体的例子,你可以使用os.environ但我知道这是不是真的,你在问什么。 )

+0

所以,如果我是在shell命令行,并希望快速,轻松地获得一些输出到一个工作的翻译,你认为这是理想的?简而言之,它不会将shell的stdout重定向到新的交互式会话。这并不理想,因为它首先启动会话,然后运行shell命令。我可能能够得到一个bash函数来写这个临时文件,并让ipython运行它。 – physicsmichael 2010-02-23 09:11:14

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是:)

+0

很明显,在这里我假设你知道'sys.path'和'echo $ PATH'只是一些随机命令,用来说明你的观点。 – badp 2010-02-23 08:59:29

+1

@bp,sys.path是python用来导入模块的路径。它不同于$ PATH。您可能正在考虑'os.environ [“PATH”]' – 2010-02-23 09:02:24

+0

@bp,您的评论点头。关于你的回答,我不想写一个my_app来解析输出。例如,将.split(':')放在自己的文件中会很麻烦。那个-i切换本身就很方便;我以为我误解了它,因为它不起作用(很像你的第一个例子所示)。 – physicsmichael 2010-02-23 09:17:04