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

管道命令,似乎有几个单独的输出到文件

  •  0
  • n1k31t4  · 技术社区  · 8 年前

    我正在使用 speedtest-cli 在python脚本中获得我的互联网速度。我想通过在shell中运行此命令 subprocess.Popen .

    `speedtest-cli --share > output.log`
    

    speedtest-cli 运行测试,同时 --share 在输出中为我提供了一个额外的链接,指向speedtest结果的图像。以下是 output.log :

    正在检索speedtest。网络配置。。。 从M-net(xxx.xxx.xxx.xxx)进行测试。。。 基于ping选择最佳服务器。。。 主持人:XXXXXXXXXXXXXXXXXX[16.12公里]:20.902毫秒 测试下载速度。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 测试上传速度。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 上传:12.49 Mbit/s 共享结果: http://www.speedtest.net/result/670483456.png

    如果我在终端中运行该命令,我会按预期获得所有测试结果以及目标文件中的链接。我确认了一切 stdout 而不是通过使用此 grep trick : command | grep .

    我尝试用Python运行它,如下所示:

    subprocess.Popen(['speedtest-cli', '--share', '>', 'output.log`],
                      stdout=subprocess.PIPE, shell=True)
    

    ...我还尝试通过python直接将输出放入文件中:

    with open('output.log', 'w') as f:
        Popen(['speedtest-cli', '--json', '--share'], stdout=f, shell=True)
    

    这两个都不管用。我得到了一个很好的文件创建与后一种方法,但链接不包括在内!(上面输出中的最后一行)。

    subprocess 模块,我变得绝望并尝试 os.system() :

    os.system('speedtest-cli --share > output.log')
    

    令人恼火的是,这起作用了。。。完整的输出和链接被捕获到文件中。

    这是怎么回事?如何使用 Popen ?

    1 回复  |  直到 8 年前
        1
  •  2
  •   larsks    8 年前

    使用时 shell=True Popen 需要成为一个 一串 ,而不是列表:

    subprocess.Popen('speedtest-cli --json --share > output.log',
                     stdout=subprocess.PIPE, shell=True)
    

    比较:

    >>> subprocess.Popen('echo hello', shell=True)
    >>> hello
    

    以及:

    >>> subprocess.Popen(['echo', 'hello'], shell=True)
    >>> 
    

    外壳=真 ,只有第一项相关,其余项忽略。

    如果您想自己收集输出,请考虑 subprocess.check_output :

    >>> output = subprocess.check_output(['echo', 'hello'])
    >>> output
    b'hello\n'
    

    或:

    >>> output = subprocess.check_output('echo hello', shell=True)
    

    check_output 方法同时适用于Python 2和Python 3。在Python 3中,您还可以使用 run 方法