Initial revision

This commit is contained in:
Guido van Rossum 1991-06-04 20:36:54 +00:00
parent 0481447f41
commit ec758ead39
16 changed files with 1007 additions and 0 deletions

18
Demo/scripts/README Normal file
View file

@ -0,0 +1,18 @@
Contents of this directory:
byteyears.py Print product of a file's size and age
eptags.py Create Emacs TAGS file for Python modules
fact.py Factorize numbers
findlinksto.py Find symbolic links to a given path (prefix)
from.py Summarize mailbox
lfact.py Factorize long numbers
lpwatch.py Watch BSD line printer queues
mkreal.py Turn a symbolic link into a real file or directory
objgraph.py Print object graph from nm output on a library
pdeps.py Print dependencies between Python modules
pi.py Print digits of pi (uses arbitrary precision integers)
primes.py Print prime numbers
ptags.py Create vi tags file for Python modules
suff.py Sort a list of files by suffix
which.py Find a program in $PATH
xxci.py Wrapper for rcsdiff and ci

45
Demo/scripts/fact.py Executable file
View file

@ -0,0 +1,45 @@
#! /usr/local/python
# Factorize numbers, slowly.
# This version uses plain integers and is thus limited to 2**31-1.
import sys
from math import sqrt
error = 'fact.error' # exception
def fact(n):
if n < 1: raise error # fact() argument should be >= 1
if n = 1: return [] # special case
res = []
# Treat even factors special, so we can use i = i+2 later
while n%2 = 0:
res.append(2)
n = n/2
# Try odd numbers up to sqrt(n)
limit = int(sqrt(float(n+1)))
i = 3
while i <= limit:
if n%i = 0:
res.append(i)
n = n/i
limit = int(sqrt(float(n+1)))
else:
i = i+2
res.append(n)
return res
def main():
if len(sys.argv) > 1:
for arg in sys.argv[1:]:
n = int(eval(arg))
print n, fact(n)
else:
try:
while 1:
n = int(input())
print n, fact(n)
except EOFError:
pass
main()

25
Demo/scripts/from.py Executable file
View file

@ -0,0 +1,25 @@
#! /usr/local/python
# Print From and Subject of messages in $MAIL.
# Extension to multiple mailboxes and other bells & whistles are left
# as exercises for the reader.
import posix
# Open mailbox file. Exits with exception when this fails.
mail = open(posix.environ['MAIL'], 'r')
while 1:
line = mail.readline()
if not line: break # EOF
if line[:5] = 'From ':
# Start of message found
print line[:-1],
while 1:
line = mail.readline()
if not line: break # EOF
if line = '\n': break # Blank line ends headers
if line[:8] = 'Subject:':
print `line[9:-1]`,
print

111
Demo/scripts/lpwatch.py Executable file
View file

@ -0,0 +1,111 @@
#! /ufs/guido/bin/sgi/python
#! /usr/local/python
# Watch line printer queue(s).
# Intended for BSD 4.3 lpq.
import posix
import sys
import time
import string
DEF_PRINTER = 'psc'
DEF_DELAY = 10
def main():
delay = DEF_DELAY # XXX Use getopt() later
try:
thisuser = posix.environ['LOGNAME']
except:
thisuser = posix.environ['USER']
printers = sys.argv[1:]
if not printers:
if posix.environ.has_key('PRINTER'):
printers = [posix.environ['PRINTER']]
else:
printers = [DEF_PRINTER]
#
clearhome = posix.popen('clear', 'r').read()
#
while 1:
# Pipe output through cat for extra buffering,
# so the output (which overwrites the previous)
# appears instantaneous.
sys.stdout = posix.popen('exec cat', 'w')
sys.stdout.write(clearhome)
for name in printers:
pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
showstatus(name, pipe, thisuser)
sts = pipe.close()
if sts:
print name + ': *** lpq exit status', sts
sts = sys.stdout.close()
time.sleep(delay)
def showstatus(name, pipe, thisuser):
lines = 0
users = {}
aheadbytes = 0
aheadjobs = 0
userseen = 0
totalbytes = 0
totaljobs = 0
while 1:
line = pipe.readline()
if not line: break
fields = string.split(line)
n = len(fields)
if len(fields) >= 6 and fields[n-1] = 'bytes':
rank = fields[0]
user = fields[1]
job = fields[2]
files = fields[3:-2]
bytes = eval(fields[n-2])
if user = thisuser:
userseen = 1
elif not userseen:
aheadbytes = aheadbytes + bytes
aheadjobs = aheadjobs + 1
totalbytes = totalbytes + bytes
totaljobs = totaljobs + 1
if users.has_key(user):
ujobs, ubytes = users[user]
else:
ujobs, ubytes = 0, 0
ujobs = ujobs + 1
ubytes = ubytes + bytes
users[user] = ujobs, ubytes
else:
if fields and fields[0] <> 'Rank':
if line[-1:] = '\n':
line = line[:-1]
if not lines:
print name + ':',
else:
print
print line,
lines = lines + 1
if totaljobs:
if lines > 1:
print
lines = lines+1
print (totalbytes+1023)/1024, 'K',
if totaljobs <> len(users):
print '(' + `totaljobs` + ' jobs)',
if len(users) = 1:
print 'for', users.keys()[0],
else:
print 'for', len(users), 'users',
if userseen:
if aheadjobs = 0:
print '(' + thisuser + ' first)',
else:
print '(' + `(aheadbytes+1023)/1024`,
print 'K before', thisuser + ')'
if lines:
print
try:
main()
except KeyboardInterrupt:
pass

30
Demo/scripts/pi.py Executable file
View file

@ -0,0 +1,30 @@
#! /usr/local/python
# Print digits of pi forever.
#
# The algorithm, using Python's 'long' integers ("bignums"), works
# with continued fractions, and was conceived by Lambert Meertens.
#
# See also the ABC Programmer's Handbook, by Geurts, Meertens & Pemberton,
# published by Prentice-Hall (UK) Ltd., 1990.
import sys
def main():
k, a, b, a1, b1 = 2l, 4l, 1l, 12l, 4l
while 1:
# Next approximation
p, q, k = k*k, 2l*k+1l, k+1l
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
# Print common digits
d, d1 = a/b, a1/b1
#print a, b, a1, b1
while d = d1:
# Use write() to avoid spaces between the digits
sys.stdout.write(`int(d)`)
# Flush so the output is seen immediately
sys.stdout.flush()
a, a1 = 10l*(a%b), 10l*(a1%b1)
d, d1 = a/b, a1/b1
main()

26
Demo/scripts/primes.py Executable file
View file

@ -0,0 +1,26 @@
#! /usr/local/python
# Print prime numbers in a given range
def main():
import sys
min, max = 2, 0x7fffffff
if sys.argv[1:]:
min = int(eval(sys.argv[1]))
if sys.argv[2:]:
max = int(eval(sys.argv[2]))
primes(min, max)
def primes(min, max):
if 2 >= min: print 2
primes = [2]
i = 3
while i <= max:
for p in primes:
if i%p = 0 or p*p > i: break
if i%p <> 0:
primes.append(i)
if i >= min: print i
i = i+2
main()