无法将始终运行的python脚本的输出记录到文件中

时间:2018-05-09 09:56:45

标签: python logging raspberry-pi

我有这个脚本检查并等待建立一些LAN连接:

import subprocess
import time
import os
import sys
sys.stdout = open('/home/pi/Desktop/file.txt', 'w')


print('checking LAN connections...')
time.sleep(2)
while(True):
    f=open("/sys/class/net/eth0/carrier","r")
    state=f.read()
    if('1' in state):
        print('LAN connection to target device established successfully !')
        break
    else:
        print('Please establish LAN connection to the target device !')
        time.sleep(4)

我希望能够在指定的日志文件中看到它的输出,但它仍然是空的。

2 个答案:

答案 0 :(得分:1)

每次写入后刷新输出流。您似乎使用的是Python 3,因此您可以为flush函数设置print()参数:

print(msg, flush=True)

如果您使用的是Python 2,则可以使用sys.stdout.flush()并编写日志记录功能:

def log(msg):
    print msg
    sys.stdout.flush()

也许更好的方法是使用logging模块。这是一个非常简单的例子:

import logging
import time

logging.basicConfig(filename='/home/pi/Desktop/file.txt', level=logging.DEBUG)
for i in range(10):
    logging.debug('Please establish LAN connection to the target device !')
    time.sleep(4)

这将追加到该文件。如果要覆盖文件,请将filemode='w'传递给basicConfig()

此外,如果您不喜欢DEBUG:root:前缀,则可以使用format='%(message)s'仅记录消息:

logging.basicConfig(filename='/home/pi/Desktop/file.txt', filemode='w', level=logging.DEBUG, format='%(message)s')

答案 1 :(得分:-1)

我相信你必须在每次写作后关闭它。 您可以实现这样的打印包装:

def print(textlog):
   with open('/home/pi/Desktop/file.txt', 'a') as myfile:
      myfile.write(textlog+"\n")

包装器的代码应如下所示:

import subprocess
import time
import os

def print(textlog):
   with open('/home/pi/Desktop/file.txt', 'a') as myfile:
      myfile.write(textlog+'\n')

print('checking LAN connections...')
time.sleep(2)
while(True):
    f=open("/sys/class/net/eth0/carrier","r")
    state=f.read()
    if('1' in state):
        print('LAN connection to target device established successfully !')
        break
    else:
        print('Please establish LAN connection to the target device !')
        time.sleep(4)

编辑:注意,使用w打开文件将删除文件的所有内容并从头开始创建内容。如果要追加,可以使用a