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

Python子处理另一个Python脚本不产生输出

  •  1
  • pomo_mondreganto  · 技术社区  · 6 年前

    我有一个简单的python3脚本 test.py :

    print('Test')
    
    while True:
        inp = input('> ')
        print(input)
    

    当我试着用它 subprocess.Popen 得到它的输出,它冻结:

    from subprocess import Popen, PIPE
    p = Popen(['python3', 'test.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False)
    print(p.stdout.read())
    

    所以,我没有从脚本中得到任何输出。我试着用 communicate 不知怎的,它起了作用:

    p.communicate()[0]
    

    但我仍然需要让管道stdout工作。从我的脚本中获取输出的第一个示例有什么问题?

    UPD: 沟通 显示中存在异常 Py EOF input 在第4行。为什么?我该如何与这样的脚本交互?

    1 回复  |  直到 6 年前
        1
  •  0
  •   blhsing    6 年前

    你没有在任何输入中输入STDIN,所以你自然会得到一个 EOFError 在第4行,这是在 input 到达EOF。但即使你给它一些输入,因为它有一个无限循环,它最终也会消耗掉所有的输入并最终提高 EOF误差 。您应该捕获异常并优雅地结束脚本。

    另外,在第5行有一个打印错误 inp 不是 输入 .

    最后,你应该经常使用 communicate 而不是直接从 stdout 或直接写信给 stdin .

    Popen's documentation :

    警告: 使用 communicate() 而不是 .stdin.write , .stdout.read .stderr.read 避免任何其他OS管缓冲区填充和阻塞子进程的死锁。

    修正的 test.py :

    print('Test')
    
    while True:
        try:
            inp = input('> ')
        except EOFError:
            print 'Done'
            break
        print(inp)
    

    正确的互动方式 Py :

    >>> from subprocess import Popen, PIPE
    >>> p = Popen(['python', 'test.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False)
    >>> p.communicate('hello\nworld\n')
    ('Test\n> hello\n> world\n> Done\n', '')
    >>>