当前位置: 首页 > 面试题库 >

subprocess.Popen()IO重定向

卫寒
2023-03-14
问题内容

尝试将子流程的输出重定向到文件。

server.py:

while 1:
    print "Count " + str(count)
    sys.stdout.flush()
    count = count + 1
    time.sleep(1)

Laucher:

cmd = './server.py >temp.txt'
args = shlex.split(cmd)
server = subprocess.Popen( args )

输出出现在屏幕上,temp.txt保持空白。我究竟做错了什么?

作为背景,我试图捕获已经编写的程序的输出。

我不能使用:

server = subprocess.Popen(
                [exe_name],
                stdin=subprocess.PIPE, stdout=subprocess.PIPE)

因为程序可能无法刷新。相反,我打算通过fifo重定向输出。如果我手动启动server.py,此方法效果很好,但如果Popen()导致重定向不起作用,则显然不可行。
ps -aux表示server.py已正确启动。


问题答案:

可选地,您可以将stdout参数与文件对象一起使用:

with open('temp.txt', 'w') as output:
    server = subprocess.Popen('./server.py', stdout=output)
    server.communicate()

如文档中所述:

stdin,stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPE,现有文件描述符(正整数),现有文件对象和无。



 类似资料:
  • 问题内容: 我正在尝试使用子进程模块和线程内部的Popen启动“ rsync”。调用rsync之后,我还需要读取输出。我正在使用communication方法读取输出。当我不使用线程时,代码运行良好。看来,当我使用线程时,它挂在通信调用上。我注意到的另一件事是,当我将shell设置为False时,在线程中运行时无法从通信中得到任何回报。 问题答案: 您没有提供任何代码供我们查看,但是以下示例与您描

  • 问题内容: 在读取文件的一部分后,我尝试在文件上调用进程。例如: 如果我在执行subprocess.call之前不从中读取任何内容,则此方法很好,但如果我从中读取了任何内容,则子流程将看不到任何内容。这是使用python 2.7.3。我在说明此行为的文档中找不到任何内容,而且对子流程源的(非常)简短的浏览没有发现原因。 问题答案: 如果您不加缓冲地打开文件,那么它将起作用: 模块在文件描述符级别(

  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 这里出现的问题是,当我在示例socekt之间连接时。使用此套接字的io客户端。io服务器(按节点)。js(只运行两个终端并打开客户端和服务器之间的套接字连接)我没有问题 但是,当我试图注入这个套接字时。io客户端到我的Ember。js应用程序,准确地说,它会将我的客户端从给定地址重定向到类似于 http://localhost:8080/socket.io/?EIO=3 我还在浏览器中粘贴了检查控

  • 问题内容: Popen的文档提到您不能指定相对于“更改工作目录” kwarg的可执行路径。 如果不是None,则子目录的当前目录将在执行之前更改为 。 请注意,搜索可执行文件时不会考​​虑此目录,因此您无法指定程序相对于的路径。 但是python在我的系统上的行为似乎与这种说法直接矛盾: 是否在使用相对路径来依赖于平台且不应依赖的东西?还是这是一个文档错误? (从评论这个问题产卵由glglgl这里

  • 问题内容: 我需要使用启动多个长时间运行的进程,并希望将和从每个自动传送到单独的日志文件。每个进程将同时运行几分钟,并且我希望在进程运行时将 每个进程* 写入两个日志文件(和)。 * 我需要不断地调用,以便更新每个日志文件上的每个进程在循环,或者是有一些方法来调用原有的命令,以便和自动传输到打开的文件句柄? 问题答案: 根据文档, stdin,stdout和stderr分别指定执行程序的标准输入,