我想做的是像
$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所说的相同原因,所做的一切都失败了。
答案 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,但我意识到这并不是您所要求的。)