【问题标题】:Python bash pipePython bash 管道
【发布时间】:2023-03-26 19:47:02
【问题描述】:

我想将 python 脚本的输出通过管道传输到 bash 脚本。到目前为止我所做的是尝试使用os.popen()sys.subprocess(),并尝试以管道为例

os.popen('echo "P 1 1 591336 4927369 1 321 " | v.in.ascii -zn out=abcx format=standard --overwrite')

但这不起作用,值"591336""4927369" 是作为python 脚本输出的变量。但是当我这样做或通过重复 echo 命令和管道手动更改值时,它可以工作(在 bash 中)。

v.in.ascii -zn out=abcx format=standard --overwrite

上面的部分bash命令是Grass GIS的一部分

谁能帮帮我!

【问题讨论】:

    标签: python bash pipe


    【解决方案1】:

    您可以只使用print 输出到stdout 并将Python 进程传送到下一个进程,例如

    python myprogram.py | ...
    

    myprogram.py 可能看起来像这样:

    for x in something:
        print dosomething(x)
    

    【讨论】:

      【解决方案2】:

      这对我有用:

      >>> stdin, stdout = os.popen2("echo %s | grep 'test'" % 'some test param')
      >>> print stdout.read()
      some test param
      
      >>>
      

      【讨论】:

        【解决方案3】:

        从 Python 2.6 开始,建议使用 subprocess 模块,而不是已弃用的 os.popen。这是一个例子:

        from subprocess import Popen, PIPE
        p = Popen(["v.in.ascii", "-zn", "out=abcx", "format=standard", "--overwrite"], stdin=PIPE)
        p.stdin.write("P 1 1 591336 4927369 1 321\n")
        p.stdin.close()
        p.wait() # unless background execution preferred
        

        【讨论】:

        • 这是我用来临时读取的 bash 命令 #!/bin/bash d.mon x1 d.rast elevation.dem d.vect abcx d.vect abcy #value=0;而读行做#value=expr $value + 1; echo $line echo $line echo "P 1 1 $line 1 321" | v.in.ascii -zn out=abcx format=standard --overwrite d.redraw #sleep 1 done
        【解决方案4】:

        我真的很喜欢 John Paulett 的回答。

        如果您使用os.system 而不是os.popen,我认为您的echo 示例会起作用。

        这里使用popen的一种方式是这样的:

        f = os.popen("v.in.ascii -zn out=abcx format=standard --overwrite", 'w')
        f.write("P 1 1 591336 4927369 1 321\n")
        f.close()
        

        (您必须指定管道用于写入。)

        【讨论】:

        • 如前所述,os.system 自 Python 2.6 起已被弃用。较新的(和受支持的)subprocess.callsubprocess.run 方法可以正常工作。
        猜你喜欢
        • 2015-07-14
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2012-05-11
        • 2010-09-06
        • 2012-03-13
        相关资源
        最近更新 更多