相关疑难解决方法(0)

如何刷新打印功能的输出?

如何强制Python的打印功能输出到屏幕?

这不是禁用输出缓冲的重复- 链接的问题是尝试无缓冲输出,而这是更一般的.这个问题的最佳答案太强大或涉及到这个问题(他们不是很好的答案),这个问题可以在谷歌上找到一个相对新手.

python printing flush python-3.x

1111
推荐指数
13
解决办法
72万
查看次数

逐行读取子进程标准输出

我的python脚本使用subprocess来调用非常嘈杂的linux实用程序.我想将所有输出存储到日志文件中并向用户显示一些输出.我认为以下内容可行,但在实用程序产生大量输出之前,输出不会显示在我的应用程序中.

#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
   print hex(i)*512
   i += 1
   time.sleep(0.5)

#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
   #the real code does filtering here
   print "test:", line.rstrip()
Run Code Online (Sandbox Code Playgroud)

我真正想要的行为是过滤器脚本在从子进程接收时打印每一行.Sorta就像tee使用python代码一样.

我错过了什么?这甚至可能吗?


更新:

如果将a sys.stdout.flush()添加到fake_utility.py,则代码在python 3.1中具有所需的行为.我正在使用python 2.6.您会认为使用proc.stdout.xreadlines()将与py3k一样工作,但事实并非如此.


更新2:

这是最小的工作代码.

#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
   print i
   sys.stdout.flush()
   time.sleep(0.5)

#display out put line by …
Run Code Online (Sandbox Code Playgroud)

python subprocess

216
推荐指数
8
解决办法
32万
查看次数

Python:在同一行上打印多个

我想运行一个脚本,它基本上显示如下内容:

Installing XXX...               [DONE]
Run Code Online (Sandbox Code Playgroud)

现在,此刻,我在功能成功后使用print打印整行.但是,我现在希望它首先打印"安装xxx ...",并在功能运行之后添加"DONE"标签; 但是在同一条线上.

有任何想法吗?

python printing stdout line-breaks

212
推荐指数
10
解决办法
44万
查看次数

在进程运行时不断打印Subprocess输出

要从我的Python脚本启动程序,我使用以下方法:

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise ProcessException(command, exitCode, output)
Run Code Online (Sandbox Code Playgroud)

因此,当我启动一个类似的过程时Process.execute("mvn clean install"),我的程序会一直等到过程结束,然后我才能获得程序的完整输出.如果我正在运行需要一段时间才能完成的过程,这很烦人.

我可以让我的程序逐行写入进程输出,通过在循环结束之前轮询进程输出或其他内容吗?

**[编辑]抱歉,在发布此问题之前我没有很好地搜索.线程实际上是关键.在这里找到一个示例,说明如何执行此操作:** 来自线程的Python Subprocess.Popen

python subprocess

175
推荐指数
9
解决办法
16万
查看次数

如何将sys.stdout复制到日志文件?

编辑:因为似乎没有解决方案,或者我正在做一些没人知道的非标准的东西 - 我会修改我的问题也要问:当python应用程序创建时,完成日志记录的最佳方法是什么很多系统调用?

我的应用程序有两种模式.在交互模式下,我希望所有输出都转到屏幕以及日志文件,包括来自任何系统调用的输出.在守护程序模式下,所有输出都将转到日志中.守护进程模式很好用os.dup2().我无法找到一种方法将所有输出"发送"到交互模式的日志,而无需修改每个系统调用.


换句话说,我想要命令行'tee'的功能,用于python应用程序生成的任何输出,包括系统调用输出.

澄清:

要重定向所有输出,我会做这样的事情,并且效果很好:

# open our log file
so = se = open("%s.log" % self.name, 'w', 0)

# re-open stdout without buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

# redirect stdout and stderr to the log file opened above
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
Run Code Online (Sandbox Code Playgroud)

关于这一点的好处是它不需要来自其余代码的特殊打印调用.该代码还运行一些shell命令,因此不必单独处理每个输出.

简单地说,我想做同样的事情,除了重复而不是重定向.

起初以为我认为简单地扭转它们dup2应该有效.为什么不呢?这是我的测试:

import os, sys

### my broken solution:
so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno()) …
Run Code Online (Sandbox Code Playgroud)

python tee

140
推荐指数
11
解决办法
10万
查看次数

在docker中运行detached时,Python应用程序不会打印任何内容

我有一个Python(2.7)应用程序,它在我的dockerfile中启动:

CMD ["python","main.py"]
Run Code Online (Sandbox Code Playgroud)

main.py在启动时打印一些字符串,然后进入循环:

print "App started"
while True:
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

只要我使用-it标志启动容器,一切都按预期工作:

$ docker run --name=myapp -it myappimage
> App started
Run Code Online (Sandbox Code Playgroud)

我可以稍后通过日志看到相同的输出:

$ docker logs myapp
> App started
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用-d标志运行相同的容器,容器似乎正常启动,但我看不到任何输出:

$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)
Run Code Online (Sandbox Code Playgroud)

但容器似乎还在运行;

$ docker ps
Container Status ...
myapp     up 4 minutes ... 
Run Code Online (Sandbox Code Playgroud)

Attach也不显示任何内容:

$ docker attach --sig-proxy=false myapp
(working, no output)
Run Code Online (Sandbox Code Playgroud)

任何想法都出错了?在后台运行时"打印"的行为会不同吗?

Docker版本:

Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit …
Run Code Online (Sandbox Code Playgroud)

python docker dockerfile

126
推荐指数
10
解决办法
4万
查看次数

如何使用Paramiko获取SSH返回码?

client = paramiko.SSHClient()
stdin, stdout, stderr = client.exec_command(command)
Run Code Online (Sandbox Code Playgroud)

有没有办法获得命令返回码?

很难解析所有stdout/stderr并知道命令是否成功完成.

python ssh paramiko

87
推荐指数
3
解决办法
6万
查看次数

linux tee没有使用python?

我制作了一个python脚本,它使用无限循环与Web服务器通信.我想将每个通信数据记录到一个文件中,并同时从终端监视它们.所以我用这样的tee命令.

python client.py | tee logfile
Run Code Online (Sandbox Code Playgroud)

但是,我从终端或日志文件中得不到任何东西.python脚本工作正常.这里发生了什么?我错过了什么吗?

一些建议将不胜感激.先感谢您.

python linux tee

87
推荐指数
1
解决办法
2万
查看次数

无法使用"#!/ usr/bin/env python"将参数传递给python

我需要一个可直接执行的python脚本,所以我用它启动了该文件#!/usr/bin/env python.但是,我也需要无缓冲输出,所以我试过#!/usr/bin/env python -u,但是失败了python -u: no such file or directory.

我发现#/usr/bin/python -u的作品,但我需要它来获得pythonPATH支持虚拟env环境.

我有什么选择?

python arguments shebang

65
推荐指数
7
解决办法
2万
查看次数

打印到同一行,而不是python中的新行

基本上我想做与这个家伙做的相反的事情......呵呵.

Python脚本:每次打印新行到shell而不是更新现有行

我有一个程序告诉我它有多远.

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete"
Run Code Online (Sandbox Code Playgroud)

因此,如果len(some_list)为50,我会将最后一行打印50次.我想打印一行并不断更新该行.我知道我知道这可能是你整天都会读到的最蹩脚的问题.我只是无法弄清楚我需要在谷歌中找到答案的四个字.

更新!我试过mvds的建议哪个看起来没错.新代码

print percent_complete,"           \r",
Run Code Online (Sandbox Code Playgroud)

完成百分比只是一个字符串(我现在第一次抽象,我试图成为文字).现在的结果是它运行程序,直到程序结束后才打印ANYTHING,然后在一行且只有一行打印"100%完成".

如果没有回车(但是使用逗号,mvds的一半建议),它将一直打印到最后.然后打印:

0 percent complete     2 percent complete     3 percent complete     4 percent complete    
Run Code Online (Sandbox Code Playgroud)

等等.所以现在新的问题是用逗号它不会打印直到程序完成.

使用回车并且没有逗号,它的行为与两者都不完全相同.

python stdout

63
推荐指数
7
解决办法
9万
查看次数