有几种方法可以写入stderr:
# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"
sys.stderr.write("spam\n")
os.write(2, b"spam\n")
from __future__ import print_function
print("spam", file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)
这似乎与Python#13 †的禅宗相矛盾,那么这里有什么区别,这种方式有哪些优点或缺点?应该使用哪种方式?
† 应该有一个 - 最好只有一个 - 显而易见的方法.
parser_logger = logging.getLogger("CSHEL_parserlogger");
#logging.basicConfig()
parser_logger.addHandler(RotatingFileHandler(
"logfile", mode='a', maxBytes=7340032, backupCount=4,
encoding=None, delay=False))
#d = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
parser_logger.info('Protocol problem: %s', 'connection reset')
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为logfile的文件,但不会向其中写入任何内容.如果我将最后一行更改为
parser_logger.warning('Protocol problem: %s', 'connection reset')
Run Code Online (Sandbox Code Playgroud)
它会将消息正确地记录到"日志文件"中.
我确信这是一件我想念的小事,但我无法弄清楚它是什么.
我想从我的hadoop流媒体作业中的文件中读取一个列表.这是我简单的mapper.py:
#!/usr/bin/env python
import sys
import json
def read_file():
id_list = []
#read ids from a file
f = open('../user_ids','r')
for line in f:
line = line.strip()
id_list.append(line)
return id_list
if __name__ == '__main__':
id_list = set(read_file())
# input comes from STDIN (standard input)
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
line = json.loads(line)
user_id = line['user']['id']
if str(user_id) in id_list:
print '%s\t%s' % (user_id, line)
Run Code Online (Sandbox Code Playgroud)
这是我的reducer.py
#!/usr/bin/env python
from operator import itemgetter
import …Run Code Online (Sandbox Code Playgroud)