Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pip install sh'及其GitHub站点是。@GIRISHRAMNANI:我看不出pyinvoke在这里有什么帮助。如果没有pty=True,则存在缓冲问题。使用pty=True,您不能分离标准输出,stderr@TrisNefzger:sh可能_Python_Subprocess_Tty_Pexpect_Pty - Fatal编程技术网

Python pip install sh'及其GitHub站点是。@GIRISHRAMNANI:我看不出pyinvoke在这里有什么帮助。如果没有pty=True,则存在缓冲问题。使用pty=True,您不能分离标准输出,stderr@TrisNefzger:sh可能

Python pip install sh'及其GitHub站点是。@GIRISHRAMNANI:我看不出pyinvoke在这里有什么帮助。如果没有pty=True,则存在缓冲问题。使用pty=True,您不能分离标准输出,stderr@TrisNefzger:sh可能,python,subprocess,tty,pexpect,pty,Python,Subprocess,Tty,Pexpect,Pty,pip install sh'及其GitHub站点是。@GIRISHRAMNANI:我看不出pyinvoke在这里有什么帮助。如果没有pty=True,则存在缓冲问题。使用pty=True,您不能分离标准输出,stderr@TrisNefzger:sh可能可以单独和增量地获取stdout和stderr,但我看不出它解决了stderr的缓冲问题(我只看到了,尽管在大多数情况下和)@J.F.Sebastian:_out_bufsize控制stderr和stdout的缓冲,并根据amoffat.git


pip install sh'及其GitHub站点是。@GIRISHRAMNANI:我看不出
pyinvoke
在这里有什么帮助。如果没有
pty=True
,则存在缓冲问题。使用
pty=True
,您不能分离标准输出,stderr@TrisNefzger:
sh
可能可以单独和增量地获取stdout和stderr,但我看不出它解决了
stderr
的缓冲问题(我只看到了,尽管在大多数情况下和)@J.F.Sebastian:_out_bufsize控制stderr和stdout的缓冲,并根据amoffat.github.io/sh/#缓冲大小将其设置为0将禁用缓冲。单个队列就足够了。答案根本没有解决硬缓冲问题。@J.F.Sebastian,如果使用单个队列,您如何知道哪个是stderr,哪个是stdout?我相信您可以自己回答这个问题。这是另一个非常好的答案,我觉得我们已经接近一个通用的解决方案,可以解决一个常见的问题。当我测试你的代码时,我只想提一下,我认为pty的全部目的是“欺骗”连接程序,使其认为它在与实际终端通信,因此不会像输出被重定向到文件或其他进程时那样缓冲其输出。i、 e.使用pty可以防止分块和其他非典型行为,允许python将命令作为直接从shell运行的命令进行子处理。@user3329564:是的,如果提供
pty
,大多数程序都使用行缓冲标准输出。我的回答中有哪一部分是相反的?子进程可以自由更改(或不更改)其行为的这一方面和其他方面,例如,
curl
如果输出是tty,则不报告进度。有时,您的代码使用b''(空二进制数组)和其他某种“null”字符串(可能是EOF)调用write,实际上什么都不做。。。可能会添加一个保护,如:if data:write()@master,但这是不可能的。如果代码中没有数据,您是否看到了
?可能是其他原因,一个不打印的空字符。。。无论如何,在实现了一些类似的东西之后,我找到了一个更好的解决方案,它不需要阅读stderr。谢谢你的回答,我也在使用Python2.7。但是你能不能把
改一下,除了:把
换成别的东西,或者把这行完全去掉?如果有人更改了代码并获得了例如syntaxerror,则不会显示!
def method1(command):
    ## subprocess.communicate() will give us the stdout and stderr sepurately, 
    ## but we will have to wait until the end of command execution to print anything.
    ## This means if the child process hangs, we will never know....
    proc=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, executable='/bin/bash')
    stdout, stderr = proc.communicate() # record both, but no way to print stdout/stderr in real-time
    print ' ######### REAL-TIME ######### '
    ########         Not Possible
    print ' ########## RESULTS ########## '
    print 'STDOUT:'
    print stdout
    print 'STDOUT:'
    print stderr
def method2(command):
    ## Using pexpect to run our command in a pty, we can see the child's stdout in real-time,
    ## however we cannot see the stderr from "curl google.com", presumably because it is not connected to a pty?
    ## Furthermore, I do not know how to log it beyond writing out to a file (p.logfile). I need the stdout and stderr
    ## as strings, not files on disk! On the upside, pexpect would give alot of extra functionality (if it worked!)
    proc = pexpect.spawn('/bin/bash', ['-c', command])
    print ' ######### REAL-TIME ######### '
    proc.interact()
    print ' ########## RESULTS ########## '
    ########         Not Possible
def method3(command):
    ## This method is very much like method1, and would work exactly as desired
    ## if only proc.xxx.read(1) wouldn't block waiting for something. Which it does. So this is useless.
    proc=subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, executable='/bin/bash')
    print ' ######### REAL-TIME ######### '
    out,err,outbuf,errbuf = '','','',''
    firstToSpeak = None
    while proc.poll() == None:
            stdout = proc.stdout.read(1) # blocks
            stderr = proc.stderr.read(1) # also blocks
            if firstToSpeak == None:
                if stdout != '': firstToSpeak = 'stdout'; outbuf,errbuf = stdout,stderr
                elif stderr != '': firstToSpeak = 'stderr'; outbuf,errbuf = stdout,stderr
            else:
                if (stdout != '') or (stderr != ''): outbuf += stdout; errbuf += stderr
                else:
                    out += outbuf; err += errbuf;
                    if firstToSpeak == 'stdout': sys.stdout.write(outbuf+errbuf);sys.stdout.flush()
                    else: sys.stdout.write(errbuf+outbuf);sys.stdout.flush()
                    firstToSpeak = None
    print ''
    print ' ########## RESULTS ########## '
    print 'STDOUT:'
    print out
    print 'STDERR:'
    print err
import threading
import queue

def run(fd, q):
    for line in iter(fd.readline, ''):
        q.put(line)
    q.put(None)


def create(fd):
    q = queue.Queue()
    t = threading.Thread(target=run, args=(fd, q))
    t.daemon = True
    t.start()
    return q, t


process = Popen(["curl","www.google.com"], stdout=PIPE, stderr=PIPE,
                universal_newlines=True)

std_q, std_out = create(process.stdout)
err_q, err_read = create(process.stderr)

while std_out.is_alive() or err_read.is_alive():
        for line in iter(std_q.get, None):
            print(line)
        for line in iter(err_q.get, None):
            print(line)
#!/usr/bin/env python3
import os
import sys
from select import select
from subprocess import Popen, PIPE

with Popen(['stdbuf', '-oL', '-e0', 'curl', 'www.google.com'],
           stdout=PIPE, stderr=PIPE) as p:
    readable = {
        p.stdout.fileno(): sys.stdout.buffer, # log separately
        p.stderr.fileno(): sys.stderr.buffer,
    }
    while readable:
        for fd in select(readable, [], [])[0]:
            data = os.read(fd, 1024) # read available
            if not data: # EOF
                del readable[fd]
            else: 
                readable[fd].write(data)
                readable[fd].flush()
#!/usr/bin/env python3
import errno
import os
import pty
import sys
from select import select
from subprocess import Popen

masters, slaves = zip(pty.openpty(), pty.openpty())
with Popen([sys.executable, '-c', r'''import sys, time
print('stdout', 1) # no explicit flush
time.sleep(.5)
print('stderr', 2, file=sys.stderr)
time.sleep(.5)
print('stdout', 3)
time.sleep(.5)
print('stderr', 4, file=sys.stderr)
'''],
           stdin=slaves[0], stdout=slaves[0], stderr=slaves[1]):
    for fd in slaves:
        os.close(fd) # no input
    readable = {
        masters[0]: sys.stdout.buffer, # log separately
        masters[1]: sys.stderr.buffer,
    }
    while readable:
        for fd in select(readable, [], [])[0]:
            try:
                data = os.read(fd, 1024) # read available
            except OSError as e:
                if e.errno != errno.EIO:
                    raise #XXX cleanup
                del readable[fd] # EIO means EOF on some systems
            else:
                if not data: # EOF
                    del readable[fd]
                else:
                    readable[fd].write(data)
                    readable[fd].flush()
for fd in masters:
    os.close(fd)
#!/usr/bin/env python2.7
import errno
import os
import pty
import sys
from select import select
import subprocess
stdout = ''
stderr = ''
command = 'curl google.com ; sleep 5 ; echo "hey"'
masters, slaves = zip(pty.openpty(), pty.openpty())
p = subprocess.Popen(command, stdin=slaves[0], stdout=slaves[0], stderr=slaves[1], shell=True, executable='/bin/bash')
for fd in slaves: os.close(fd)

readable = { masters[0]: sys.stdout, masters[1]: sys.stderr }
try:
    print ' ######### REAL-TIME ######### '
    while readable:
        for fd in select(readable, [], [])[0]:
            try: data = os.read(fd, 1024)
            except OSError as e:
                if e.errno != errno.EIO: raise
                del readable[fd]
            finally:
                if not data: del readable[fd]
                else:
                    if fd == masters[0]: stdout += data.decode('ascii')
                    else: stderr += data.decode('ascii')
                    readable[fd].write(data)
                    readable[fd].flush()
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise
finally:
    p.wait()
    for fd in masters: os.close(fd)
    print ''
    print ' ########## RESULTS ########## '
    print 'STDOUT:'
    print stdout
    print 'STDERR:'
    print stderr