代码之家  ›  专栏  ›  技术社区  ›  physicsmichael

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

  •  2
  • physicsmichael  · 技术社区  · 15 年前

     $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。英国石油公司表示,由于同样的原因,一切都失败了。

    3 回复  |  直到 15 年前
        1
  •  2
  •   John La Rooy    15 年前

    在IPython,你可以做到这一点

    x = !echo $$$$PATH
    

    双重逃避 $ 但这是一种痛苦

    我想你可以这么做

    PATH="$PATH"
    x = !echo $PATH
    x[0].split(":")
    
        2
  •  1
  •   badp    15 年前

    这个 --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 执行完毕后, 标准输入 已关闭,无法进行进一步的输入。

    出于同样的原因,类似于:

    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") 文件对象是否与 标准输入 是:)

        3
  •  0
  •   David Webb    15 年前

    由于Python的公理是“应该有一种——最好只有一种——显而易见的方式来做”,因此我有理由相信,没有比这更好的方式来与其他进程交互 the subprocess module .

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

    os.environ 但我意识到这并不是你真正想要的。)