How to better control print and stdout? (thanx)

Drew Smathers drew.smathers at earthlink.net
Fri Mar 14 01:19:31 CET 2003


Thanks to Jeff Epler, Erik Max Francis, Donn Cave and Peter Hansen.  All of your suggestions were very helpful.  Okay so here's my finished code (an amalgamation of everyone's ideas).  Any further observations or even critisms would be much appreciated  (by the way, what exactly is the difference between range and xrange?):

#!/usr/bin/env python
import sys, time

def output(char):
	sys.stdout.write(char); sys.stdout.flush()

def spinner(rotations, interval, message=''):
	for x in xrange(rotations):
		output(message + '|/-\\'[x%4] + '\r')
		time.sleep(interval)
	output(' ')
	for i in xrange(len(message)): print ' ',
	output('\r')

def countdown(count, message=''):
	for x in xrange(count,0,-1):
		output(message + str(x) + '   \r')
		time.sleep(1)
	output('Done!')
	for i in xrange(len(message)): print ' ',
	output('\n')
	
	
if __name__ == '__main__':
	usage = '''Usage: counter.py spin rotations interval [message]
       counter.py count integer [message]'''
	try:						
		if sys.argv[1] == 'spin':
			if len(sys.argv) == 5:
				spinner(int(sys.argv[2]), 
				        float(sys.argv[3]), 
						  message=str(sys.argv[4]))
			elif len(sys.argv) == 4:
				spinner(int(sys.argv[2]),
						  float(sys.argv[3]))
			else: print usage	
		elif sys.argv[1] == 'count':
			if len(sys.argv) == 4:
				countdown(int(sys.argv[2]),message=str(sys.argv[3]))
			elif len(sys.argv) == 3:
			   countdown(int(sys.argv[2]))
			else: print usage	
		else:
			print usage
	except KeyboardInterrupt: pass		
	except: print usage		

 


-------Original Message-------
From: Peter Hansen <peter at engcorp.com>
Sent: 03/14/03 06:54 PM
To: python-list at python.org
Subject: Re: How to better control print and stdout?

> 
> Drew Smathers wrote:
> 
> Basically, all I want to do is be able to make nice 
> countdowns, or the classic spinner (|,/,-,\), using the escape 
> code '\b'.
> Is there anyway to get around this without using any fancy libs like
ncurses?

Based on Erik Max's suggestions:


import sys, time

def output(char):
    sys.stdout.write(char)
    sys.stdout.flush()

def spinner(rotations, interval):
    symbols = '|/-\\'
    for x in xrange(rotations):
        for ch in symbols:
            output(ch + '\b')
            time.sleep(interval)
    output(' \n')

if __name__ == '__main__':
    spinner(int(sys.argv[1]), float(sys.argv[2]))

c:\> python spins.py 55 .05

(outputs |/-\ etc....)


-Peter
-- 
<a target=_blank
href="http://mail.python.org/mailman/listinfo/python-list">http://mail.python.org/mailman/listinfo/python-list</a>
> 





More information about the Python-list mailing list