2

我想做的是

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

我想 ipython 解决方案是最好的。如果这无法实现,对于我想处理各种其他命令的输出的情况,您的解决方案是什么?之前绝望的时候用过 subprocess 来做,但并不理想。

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

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

现在我们怎样才能把它弯曲成一个形式

 echo $PATH | pyout

pyout“我所有问题的神奇解决方案”在哪里。它可能是一个 shell 脚本,它编写管道输出然后运行 ​​ipython。出于同样的原因,bp 所说的一切都失败了。

4

3 回答 3

2

在 IPython 中你可以做到这一点

x = !echo $$$$PATH

的双重逃脱$虽然是一种痛苦

我猜你可以这样做

PATH="$PATH"
x = !echo $PATH
x[0].split(":")
于 2010-02-23T08:51:43.227 回答
1

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

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

但是,这就是将显示的全部内容:

>>>

那么为什么它不起作用呢?因为你是管道。python 解释器正在尝试从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是:)

于 2010-02-23T08:56:02.503 回答
0

由于 Python 公理“应该有一种——最好只有一种——明显的方式来做到这一点”,我有理由相信,除了模块之外subprocess没有更好的方式与其他进程交互。

如果您能说出为什么类似以下“不理想”的内容可能会有所帮助:

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

(在您的具体示例中,您可以使用os.environ,但我意识到这并不是您真正要问的。)

于 2010-02-23T08:50:03.403 回答