Re: Is unicode_escape broken?

2005-12-13 Thread jepler
I also believe this is a bug.

Here's an even shorter demonstration of the behavior:
 u\\.encode(unicode_escape).decode(unicode_escape)
Traceback (most recent call last):
  File stdin, line 1, in ?
UnicodeDecodeError: 'unicodeescape' codec can't decode byte 0x5c in
position 0: \ at end of string

To report a bug, follow the directions at the bottom of this page:
http://www.python.org/2.4.2/bugs.html

To report a bug not listed above, always check the SourceForge Bug
Tracker[1] to see if they've already been reported. Use the bug tracker to
report new bugs. If you have a patch, please use the SourceForge Patch
Manager[2]. Please mention that you are reporting a bug in 2.4.2, and note
that you must have a SourceForge account and be logged in to submit a
bug report or patch (we require this in case we need more information
from you).

[1] http://sourceforge.net/bugs/?group_id=5470
[2] http://sourceforge.net/patch/?group_id=5470

Jeff


pgpEyu8PaWgYV.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Overloading

2005-12-09 Thread jepler
On Fri, Dec 09, 2005 at 06:29:12PM +0100, Johannes Reichel wrote:
 Hi!
 
 In C++ you can overload functions and constructors. For example if I have a
 class that represents a complex number, than it would be nice if I can
 write two seperate constructors

Python doesn't support this, but it does support default arguments:
class Complex:
def __init__(self, real=0, imag=0):
self.real = real
self.imag = imag

 And by the way, is it possible to overload operators like +,-,*?
 
 def operator+(self,complex2):

The special methods have names like __add__.
http://docs.python.org/ref/numeric-types.html

Jeff


pgpBaCTVXSEn0.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: uuDecode problem

2005-12-07 Thread jepler
Note that you can use the 'uu' encoding, which will handle
arbitrary-length input and give multi-line uuencoded output, including
the 'begin' and 'end' lines:
 print (\377 * 120).encode(uu)
begin 666 data
M
M

 
end

Otherwise, you should use something like
encoded = [binascii.b2a_uu(chunk)
for chunk in iter(lambda: someFile.read(45), )]
to send at most 45 bytes to each call to b2a_uu.

Jeff


pgpK0PRYLozaB.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: junk pointer ????

2005-12-06 Thread jepler
It means there is a bug in a Python extension or in Python itself.

If you can reproduce the bug by importing only modules written in Python
or included with Python, then you should document the steps to do so in
a bug report in the bug tracker on  http://sourceforge.net/python

If you can only reproduce the bug by importing third-party modules,
report the bug to the third-party module author or maintainer.

Jeff


pgpYS20PlpVID.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Constructing RFC2822 Message

2005-12-05 Thread jepler
On Mon, Dec 05, 2005 at 06:27:44AM -0800, Narendra wrote:
 I was able to do that but my e-mail is ending in bulk when i'm trying
 to senf to hotmail/msn.

Perhaps this is an over-zealous filter on the hotmail/msn side, not a
problem with Python.

I don't know for sure, but some news stories indicate that without the
presence of a special DNS record, microsoft treats messages as spam--
e.g. http://news.zdnet.com/2100-1009-5758365.html

Jeff


pgpiCUTsOPQDx.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Detect character encoding

2005-12-05 Thread jepler
Perhaps this project's code or ideas could be of service:
http://freshmeat.net/projects/enca/

Jeff


pgpYyDfS0xrTp.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: apply()?

2005-12-05 Thread jepler
First, get the method with getattr() and then use the *-notation or
apply to call it with args.
getattr(obj, func_name)(*args)
or
apply(getattr(obj, func_name), args)

Jeff


pgpm38MC4TzIU.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: hash()

2005-12-05 Thread jepler
 [John Marshall]
  For strings of  1 character, what are the chances
  that hash(st) and hash(st[::-1]) would return the
  same value?
 
On Mon, Dec 05, 2005 at 09:11:14PM -0500, Tim Peters wrote:
 First, if `st` is a string, `st[::-1]` is a list.  Do you really mean
 to compare string hashes with list hashes here?  I'm going to assume
 not.

It is?

 st = french frogs
 st[::-1]
'sgorf hcnerf'

(Python 2.3)

Jeff


pgpqcPNSOBZiC.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: How to execute an EXE via os.system() with spaces in the directory name?

2005-12-03 Thread jepler
This comes up from time to time.  The brain damage is all Windows', not
Python's.  Here's one thread which seems to suggest a bizarre doubling
of the initial quote of the commandline.

http://groups.google.com/group/comp.lang.python/browse_frm/thread/89d94656ea393d5b/ef40a65017848671


pgp1T5KPY01oo.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: A bug in struct module on the 64-bit platform?

2005-12-01 Thread jepler
I'm guessing that the expected behavior is
 struct.calcsize('idi')
20
because the double should be aligned to an 8-byte boundary.
This is the case on my linux/x86_64 machine:
$ python -c 'import struct; print struct.calcsize(idi)'
20
I don't know much about 'itanium', but i'd be surprised if they
chose 4-byte alignment for doubles.

http://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,180,00.html

Jeff


pgpgMOnsB8Jx5.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Is there no compression support for large sized strings in Python?

2005-12-01 Thread jepler
On this system (Linux 2.6.x, AMD64, 2 GB RAM, python2.4) I am able to
construct a 1 GB string by repetition, as well as compress a 512MB
string with gzip in one gulp.

$ cat claudio.py 
s = '1234567890'*(1048576*50)

import zlib
c = zlib.compress(s)
print len(c)
open(/tmp/claudio.gz, wb).write(c)

$ python claudio.py 
1017769

$ python -c 'print len(m * (1048576*1024))'
1073741824

I was also able to create a 1GB string on a different system (Linux 2.4.x,
32-bit Dual Intel Xeon, 8GB RAM, python 2.2).

$ python -c 'print len(m * 1024*1024*1024)'
1073741824

I agree with another poster that you may be hitting Windows limitations rather
than Python ones, but I am certainly not familiar with the details of Windows
memory allocation.

Jeff


pgp5mU0n0xkOj.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: URI http get

2005-12-01 Thread jepler
The urllib2 module is designed for tasks like this.  The tutorial
shows how to use urllib2.urlopen() to fetch the contents of a URL
using the http protocol.

Jeff


pgpdV8higv7SR.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Death to tuples!

2005-11-29 Thread jepler
On Tue, Nov 29, 2005 at 10:41:13AM +, Bengt Richter wrote:
 Seems like str.__mod__ could take an arbitary (BTW, matching length, 
 necessarily?
 Or just long enough?) iterable in place of a tuple, just like it can take
 an arbitrary mapping object in place of a dict for e.g. '%(name)s'% 
 {'name':'name value'}

What, and break reams of perfectly working code?

s = set([1, 2, 3])
t = [4, 5, 6]
u = qwerty
v = iter([None])
print The set is: %s % s
print The list is: %s % t
print The string is: %s % u
print The iterable is: %s % v

Jeff


pgpb5oni2WBfO.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: run runs away

2005-11-29 Thread jepler
run is not the name of a Python built-in function.  That leaves
everyone but you somewhat in the dark about why it does or does not wait
for the created process to complete.

If you want a function that starts a new process and waits for it to
complete, you probably want to use os.spawnv(os.P_WAIT, ...).

Jeff


pgpcb8p6UbphM.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: unicode speed

2005-11-29 Thread jepler
On Tue, Nov 29, 2005 at 09:48:15AM +0100, David Siroky wrote:
 Hi!
 
 I need to enlighten myself in Python unicode speed and implementation.
 
 My platform is AMD [EMAIL PROTECTED] (x86-32), Debian, Python 2.4.
 
 First a simple example (and time results):
 
 x = a*5000
 real0m0.195s
 user0m0.144s
 sys 0m0.046s
 
 x = ua*5000
 real0m2.477s
 user0m2.119s
 sys 0m0.225s
 
 So my first question is why creation of a unicode string lasts more then 10x
 longer than non-unicode string?

string objects have the optimization described in the log message below.
The same optimization hasn't been made to unicode_repeat, though it would
probably also benefit from it.


r30616 | rhettinger | 2003-01-06 04:33:56 -0600 (Mon, 06 Jan 2003) | 11 lines

Optimize string_repeat.

Christian Tismer pointed out the high cost of the loop overhead and
function call overhead for 'c' * n where n is large.  Accordingly,
the new code only makes lg2(n) loops.

Interestingly, 'c' * 1000 * 1000 ran a bit faster with old code.  At some
point, the loop and function call overhead became cheaper than invalidating
the cache with lengthy memcpys.  But for more typical sizes of n, the new
code runs much faster and for larger values of n it runs only a bit slower.


If you're a C coder too, consider creating and submitting a patch to do this
to the patch tracker on http://sf.net/projects/python .  That's the best thing
you can do to ensure the optimization is considered for a future release of
Python.

Jeff


pgpHIYtCvVjwy.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Data Structure in Python like STL Stack?

2005-11-28 Thread jepler
What property of the STL stack is important to you?

You can use a Python list as a stack.  It has methods append() and
pop() which run in amortized-constant-time.  It can be tested for
empty/nonempty in constant time too (if st: # stack is not empty).

Jeff


pgpU1CCrfIPhk.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: exception KeyboardInterrupt and os.system command

2005-11-27 Thread jepler
You can tell by the exit code from system() whether the subprocess
exited due to a signal.  Consider this code:
import os
while 1:
print os.system(sleep 1)
unless you happen to hit ctrl-c at the right time, you'll see it print
2 (and 0 when the sleep finishes).  The exit code can be interpreted
according to the waitpid manpage, though I am not sure where the Python
equivalent of the WIFSIGNALED and WTERMSIG macros are.

Jeff


pgpm5kEy1m2f8.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: How to find the port a server is listening on (from within the server)

2005-11-25 Thread jepler
If I understand correctly, you're looking for the socket method
getsockname(), documented at
http://docs.python.org/lib/socket-objects.html

Jeff


pgppauvaXgXhK.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: strange behaviour when writing a large amount of data on stdout

2005-11-23 Thread jepler
That code works here.

Python2.4 (#60, Nov 30 2004, 11:49:19) [MSC v.1310 32 bit (Intel)] on win32

It's Windows XP, Pentium 4, unknown amount of RAM.  I'm running python.exe in a
console window.  It also worked in IDLE.

Jeff


pgptwrbVpG8CR.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Why is dictionary.keys() a list and not a set?

2005-11-23 Thread jepler
You can already get a set from a dictionary's keys in an efficient manner:
 l = dict.fromkeys(range(10))
 set(l)
Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Jeff


pgplWRjKoPA4t.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Would cgi be the only option if my webhosting doesn't have psp, zpt, cheetah or mod_python?

2005-11-23 Thread jepler
You might benefit some from scgi.  From the httpd side, you can either use
mod_scgi in the server or cgi2scgi if can't install mod_scgi.

cgi2scgi doesn't have all the performance benefit of mod_scgi, but cgi2scgi is
a fairly lightweight C program.

http://www.mems-exchange.org/software/scgi/

Jeff


pgpmJkXuaAabd.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Why is dictionary.keys() a list and not a set?

2005-11-23 Thread jepler
One reason might be Practicality.  The zip() versions handily beat the
listcomp versions on a 10kitem dict. (python2.4)

$ timeit.py -s 'd = dict.fromkeys(range(1))' '[(v, k) for (k, v) in 
d.iteritems()]'
100 loops, best of 3: 5.05 msec per loop
$ timeit.py -s 'd = dict.fromkeys(range(1))' '[(v, k) for (k, v) in 
d.items()]'
100 loops, best of 3: 7.14 msec per loop
$ timeit.py -s 'd = dict.fromkeys(range(1))' 'zip(d.itervalues(), 
d.iterkeys())'
100 loops, best of 3: 3.13 msec per loop
$ timeit.py -s 'd = dict.fromkeys(range(1))' 'zip(d.values(), d.keys())'
100 loops, best of 3: 3.28 msec per loop

For comparison,
$ timeit.py -s 'd = dict.fromkeys(range(1))' 'd.items()'
100 loops, best of 3: 2.19 msec per loop

Maybe there are also other reasons to promise this property that I'm not
aware of.  Certainly it seems like this property is useful and not hard
to provide for non-perverse implementations, much like the
now-documented stability of sort().

Jeff


pgpFswMIA8C6O.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: after sorted from the lists

2005-11-22 Thread jepler
 ll = [[1,2],[2,1],[3,1],[1,4],[3,3],[1,4]]
 ls = [frozenset(i) for i in ll]
 ss = set(ls)
 ss
set([frozenset([1, 3]), frozenset([1, 2]), frozenset([1, 4]), frozenset([3])])
 [list(i) for i in ss]
[[1, 3], [1, 2], [1, 4], [3]]


pgphz7iINDVUi.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: user-defined operators: a very modest proposal

2005-11-22 Thread jepler
If your proposal is implemented, what does this code mean?
if [1,2]+[3,4] != [1,2,3,4]: raise TestFailed, 'list concatenation'
Since it contains ']+[' I assume it must now be parsed as a user-defined
operator, but this code currently has a meaning in Python.

(This code is the first example I found, Python 2.3's test/test_types.py, so it
is actual code)

I don't believe that Python needs user-defined operators, but let me share my
terrible proposal anyway:  Each unicode character in the class 'Sm' (Symbol,
Math) whose value is greater than 127 may be used as a user-defined operator.
The special method called depends on the ord() of the unicode character, so
that __u2044__ is called when the source code contains u'\N{FRACTION SLASH}'.
Whatever alternate syntax is adopted to allow unicode identifier characters to
be typed in pure ASCII will also apply to typing user-defined operators.  r
and i versions of the operators will of course exist, as in __ru2044__ and
__iu2044__.

Also, to accomodate operators such as u'\N{DOUBLE INTEGRAL}', which are not
simple unary or binary operators, the character u'\N{NO BREAK SPACE}' will be
used to separate arguments.  When necessary, parentheses will be added to
remove ambiguity.  This leads naturally to expressions like
\N{DOUBLE INTEGRAL} (y * x**2) \N{NO BREAK SPACE} dx \N{NO BREAK SPACE} 
dy
(corresponding to the call (y*x**2).__u222c__(dx, dy)) which are clearly easy
to love, except for the small issue that many inferior editors will not clearly
display the \N{NO BREAK SPACE} characters.

Some items on which I think I'd like to hear the community's ideas are:
* Do we give special meaning to comparison characters like
  \N{NEITHER LESS-THAN NOR GREATER-THAN}, or let users define them in new
  ways?  We could just provide, on object,
def __u2279__(self, other): return not self.__gt__(other) and 
other.__gt__(self)
  which would in effect satisfy all users.

* Do we immediately implement the combination of operators with nonspacing
  marks, or defer it?  If we implement it, do we allow the combination with
  pure ASCII operators, as in 
u'\N{COMBINING LEFT RIGHT ARROW ABOVE}+'
  or treat it as a syntax error?  (BTW the method name for this would be
  __u20e1u002b__, even though it might be tempting to support __u20e1x2b__,
  __u2oe1add__ and similar method names)  How and when do we normalize
  operators combined with more than one nonspacing mark?

* Which unicode operator methods should be supported by built-in types?
  Implementing __u222a__ and __iu222a__ for sets is a no-brainer,
  obviously, but what about __iu2206__ for integers and long?

* Should some of the unicode mathematical symbols be reserved for literals?
  It would be greatly preferable to write \u2205 instead of the other 
proposed
  empty-set literal notation, {-}.  Perhaps nullary operators could be 
defined,
  so that writing \u2205 alone is the same as __u2205__() i.e., calling the
  nullary function, whether it is defined at the local, lexical, module, or
  built-in scope.

* Do we support characters from the category 'So' (symbol, other)?  Not
  doing so means preventing programmers from using operators like
  \un{HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW}.  Who are we to
  make those kinds of choices for our users?

Jeff


pgpziuZQLsEh3.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: user-defined operators: a very modest proposal

2005-11-22 Thread jepler
On Tue, Nov 22, 2005 at 04:08:41PM -0800, Steve R. Hastings wrote:
 Actually, that's a better syntax than the one I proposed, too:
 
 __+__
 # __add__ # this one's already in use, so not allowed
 __outer*__

Again, this means something already.

 __ = 3
 __+__
6
 __outer = 'x'
 __outer*__
'xxx'

Jeff


pgpNa1qktcWxk.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: writing a generic method

2005-11-21 Thread jepler
You could use a format like #s#sO, and then use PyFloat_Check,
PyFloat_AsDouble, and the equivalent PyInt macros to get the C value out of
the Python object.

You should be able to use the converter O to get what you want.  The
conversion function might look like:
int double_only(PyObject *o, double *d) {
if(!PyFloat_Check(o)) return 0;
*d = PyFloat_AsDouble(o);
}
and the call would be

if(PyArg_ParseTuple(args,s#s#O,cname,lname,cprop,lprop,double_only,x))
 mdbgetd_(cname,cprop,x,z,lname,lprop);
(untested)

I believe that if you write
if(PyArg_ParseTuple(...))
else(PyArg_ParseTuple(...))
you're missing a PyErr_Clear() before the second PyArg_ParseTuple().  Returning
non-NULL when an exception has been set in C code will lead to a hard-to-trace
failure down the road.

Jeff


pgpq4yB9LZ1AX.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Python install minimum requirements

2005-11-21 Thread jepler
If I found the right U3 when I googled, then maybe this is relevant:
http://www.voidspace.org.uk/python/movpy/

Jeff


pgp1AjuUdEskN.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Tkinter: scrollbar in grid-managed frame

2005-11-16 Thread jepler
Tkinter frames don't scroll.  Instead, you need to use something like
bwidget's ScrollableFrame widget.  You may want to combine this with
bwidget's ScrolledWindow.

Below is an example which uses my pybwidget package, available at
http://tkinter.unpy.net/bwidget/
# --
import Tkinter, bwidget
 
t = Tkinter.Tk()
s = bwidget.ScrolledWindow(t, auto=vertical, scrollbar=vertical)
f = bwidget.ScrollableFrame(s, constrainedwidth=True)
g = f.getframe()

for i in range(20):
Tkinter.Label(g, text=Field %d:   % i).grid(row=i, column=0, sticky=w)
Tkinter.Entry(g, width=25).grid(row=i, column=1, sticky=ew) 
g.grid_columnconfigure(1, weight=1)

s.setwidget(f)
s.pack(fill=both, expand=1)
t.mainloop()
# --

Jeff



pgplDevMyZAn5.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: strange file.write() behavior on windows: $ConvertToNonresident, $ReplaceAttribute2

2005-11-16 Thread jepler
This is really just a snide joke at the expense of Microsoft, but have you
checked the MSDN documentation about ConvertToNonresident or ReplaceAttribute2?

Your search - site:msdn.microsoft.com ConvertToNonresident OR
ReplaceAttribute2 - did not match any documents. 
-- google.com

Internally, Python also simply calls fwrite().  Are you using the same C
runtime for both sets of tests?

Jeff


pgpbAHQzcNQfx.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Can anyone tell me if pygame and Tkinter can work together?

2005-11-15 Thread jepler
It's likely to be a challenge; each one has its own event loop, and
the exact pitfalls of trying to use both at the same time probably
depend on the operating system too.  For instance, on X, Tk and SDL
probably both expect full control of the handlers registered with
XSetErrorHandler and XSetIOErrorHandler, but Xlib only permits a single
handler.

Jeff


pgpitiDFj2031.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Can anyone tell me if pygame and Tkinter can work together?

2005-11-15 Thread jepler
On Tue, Nov 15, 2005 at 06:33:40PM -0700, Nathan Pinno wrote:
 Thanks. I was going to use TKInter to pop up a message box, then use pygame
 to run the game and display the score on the playing surface. Is this still
 possible (I'm using Python 2.4.1 and Pygame 1.7.0 on WinXP with Service Pack
 2)?

This is more likely to work than the scenario I first considered, where both
GUI libraries would be in use at the same time.

With my understanding of how X works, and my knowledge of Tk, you'd probably be
successful if what you want to do is first use GUI Library A, and then GUI
Library B.  This resolves the issue with XSetErrorHandler, for instance,
because you'll be completely done with Library A at the time you call the
initialization routines of Library B.  It also resolves the event loop problem,
because you never need to allow Libraries A and B to receive events during the
same phase of the program.

I don't know anything about Windows, and I haven't actually given this scenario
a try on Linux either, so it's still all idle speculation on my part.  Actual
experimentation on your part wouldn't be that hard, though.  Just write the
simplest possible Tk program as a callable function 't()' and the simplest 
possible
pygame program as a callable function 'p()', and then see what happens when you 
run
them back to back:
def t():
import Tkinter
t = Tkinter.Tk()
Tkinter.Button(t, command = t.destroy).pack()
t.mainloop()
def p():
likewise
t()
p()

Jeff


pgpa7tscRa2rv.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: how do i use tkinter.createfilehandler with a regular c program?

2005-11-14 Thread jepler
Compared to your program, I
 * Made sure that the slave program actually flushed its stdout buffers
 * didn't call read(), which will by default continue reading until
   it reaches EOF, not merely read the available data

#!/usr/bin/env python
import sys, time, Tkinter, itertools, _tkinter, os

if '-slave' in sys.argv:
for i in itertools.count():
time.sleep(1)
print This is a line of output:, i
sys.stdout.flush()
raise SystemExit

root = Tkinter.Tk()
root.wm_withdraw()

fh = os.popen('%s -slave' % sys.argv[0])

def reader(*args):
line = fh.readline()
if not line:
print EOF from slave
raise SystemExit
print from slave: %r % line

_tkinter.createfilehandler(fh, Tkinter.READABLE, reader)
root.mainloop()


pgpGq56Vnc7dS.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Tix BUG? Where to submit?

2005-11-14 Thread jepler
Since this is a bug in Python (Tix.py), it should be submitted to the Python
Patch tracker at sf.net/projects/python

You need a free sourceforge account to submit an item to the bug or patch
tracker.

Jeff


pgp1zmMFcYHrz.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Iterator addition

2005-11-13 Thread jepler
On Sun, Nov 13, 2005 at 09:44:43PM +, Bengt Richter wrote:
 even if expr1 had a __unaryop__ method,
 expr1 - expr2
 could not become
 expr1.__unaryop__(-expr2)
 unless you forced the issue with
 expr1 (-expr2)

as opposed to being a function call?  I don't think you've solved the ambiguity 
problem yet.

Jeff


pgpywgKNiDRtk.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Sorting dominoes

2005-11-13 Thread jepler
So if you have the dominoes (1 2), (3 2) and (3 1) you must arrange them as
1|2|3
2|3|1
?  If so, then it seems to me your algorithm is this:
1. pick an arbitrary domino to be first, and an arbitrary side to be the top
2a. until the dominoes are exhausted, pick the other domino with the same digit
   as the bottom of the last domino picked, and put that digit on the top.
2b. If there is no domino with the same digit, then pick an arbitrary domino as
   in step 1

Jeff


pgp3e5SVRjwKK.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: changeing users on linux

2005-11-12 Thread jepler
On Fri, Nov 11, 2005 at 11:25:56PM -0500, Mike Meyer wrote:
 You didn't say what the password was for, so I skipped asking for it.

You're a real comedian.

Jeff


pgpxqmFz5jalu.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Tkinter and the re/sizing of columns in a grid

2005-11-12 Thread jepler
Normally, an entry widget requests horizontal space equal to the value of the
width= option times the average character width of the font it displays.

Setting it to 0 makes the entry request exactly enough width to show the string
it contains.

Making them sticky to the east and west sides of their areas make them grow
to the size of the grid cell, if it is larger than their requested size.

Making the grid column have nonzero weight means that if the user resizes
the window to be wider, extra space will be given to the entry widgets.

Perhaps this program does what you're looking for:
#---
from Tkinter import *

t = Tk()
l1 = Label(t, text=String 1:)
l2 = Label(t, text=String 2:)
e1 = Entry(t, width=0); e1.insert(end, eggs); e1.focus()
e2 = Entry(t, width=0); e2.insert(end, spam)

l1.grid(row=0, column=0, sticky=w)
l2.grid(row=1, column=0, sticky=w)
e1.grid(row=0, column=1, sticky=ew)
e2.grid(row=1, column=1, sticky=ew)

t.grid_columnconfigure(1, weight=1, minsize=120)
t.wm_title(entry width demo)
t.mainloop()
#---


pgp6Rij7z8hDA.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: x, y coordinates in Tkinter canvas

2005-11-11 Thread jepler
Let's find out!  This program creates a series of rectangles, with the color
going from black to nearly white.  White corresponds to higher x and y
coordinate values.  So the answer to your question can be seen in the output
of the program.

import Tkinter

c = Tkinter.Canvas(width=220, height=220)
c.pack()

for i in range(0, 200, 20):
lum = i * 255 / 200
color = #%02x%02x%02x % (lum, lum, lum)
c.create_rectangle( i, i, i+40, i+40, fill=color)

c.mainloop()


pgpSbn6OJyaNx.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: struct, IEEE-754 and internal representation

2005-11-09 Thread jepler
Use 'd' as the format character for 64-bit double precision numbers with struct.

 x = 148.73
 unpack(d, pack(d, x))[0] == x
True
 unpack(f, pack(f, x))[0] == x
False

Jeff


pgpB2b9owxZs7.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: user account logon from python

2005-11-08 Thread jepler
login APIs vary widely from system to system.

Classic Unix systems use calls like getpwent and crypt to check passwords, and
then call setuid, setgid and setgroups to set the identity of the user who is
logging in.  These are all available in stock Python, check the library
reference for more details.  Other login-time activities, like writing utmp
entries, may not be directly available in stock Python modules.

Many modern Linux systems use something called 'pam' for login-related
activities, and there seems to be something called 'python-pam' out there, but
I've never used it.

Graphical login managers have their own additional requirements, such as
starting and stopping the X server, managing the X authentication information,
etc.

Jeff


pgpGY28NFZu6j.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Tkinter and X11

2005-11-07 Thread jepler
There should be no problem with this.  After all, even the greeter is just an
X application.  Depending on which login manager you use (xdm/kdm/gdm/whatever)
the details of getting your Tkinter app to actually be run will vary, though.
In gdm, it looks like adding it to the file /etc/X11/gdm/Init/default may be
the ticket.

It is probably best to run
app.tk.call(rename, send, )
in your program, for the reasons outlined in the send(n) manpage:
SECURITY
The  send  command is potentially a serious security loophole. On Unix,
any application that can connect to your X server can send  scripts  to
your  applications.   These  incoming  scripts  can use Tcl to read and
write your files and invoke subprocesses under your  name.

Jeff


pgpboAbTGH8cL.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: O_DIRECT on stdin?

2005-11-07 Thread jepler
I think this is fcntl(..., F_SETFL, ...), so something like
import os, fcntl, sys
flags = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL)  
flags |= os.O_DIRECT
fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, flags)

Jeff


pgpx52DBavw3Y.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: O_DIRECT on stdin?

2005-11-07 Thread jepler
Here's some text from my open(2) manpage:
Transfer  sizes,  and the alignment of user buffer and file offset must all
be multiples of the logical block  size  of the file system.
It's unlikely that in practice you can get Python's sys.stdin.read() or
os.read() to reliably use a buffer that fits the alignment restriction.

However, a small C extension could provide something like os.read() which
*does* meet the restriction.  The meat of it would look something like
#define PAGESIZE 4096   // a guess which may be right for x86 linux
#define REQUESTSIZE 1048576

ssize_t result;
char *buf, *base;
PyObject *pyresult;

buf = malloc(bufsize, REQUESTSIZE + PAGESIZE - 1);
base = round_up(buf, PAGESIZE);

result = read(0, base, REQUESTSIZE);

if(result == -1) { 
set python error from errno
pyresult = NULL;
goto DONE;
}

pyresult = PyString_FromStringAndSize(base, result);

DONE:
free(buf);
return pyresult;

Here's a clever but untested C macro that claims to implement round_up:
#define round_up(amount, align) amount) - 1) | ((align) - 1)) + 1)

Jeff


pgpvapMvYEo9L.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: fcntl.flock() not working when called from a function

2005-11-04 Thread jepler
The file you open() may be closed as soon as it is no longer possible to refer 
to it.

So in the first case, because the top-level variable 'f' continues to refer to 
the opened
file, the file may not be closed.

In the second case, no variable refers to the opened file after lock() returns, 
so Python is
free to close the file at any time.  In fact, Python happens to close the 
function exactly
when lock() returs.

If you want an open file descriptor that is not automatically closed, use 
os.open().  Or,
store the file descriptor somewhere so you can later close() or unlock it at an
appropriate time.

Jeff


pgpv7jRCugW7o.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: taking x-window screen shot

2005-10-31 Thread jepler
I recommend using 'xwd' to actually get the screenshot, because xwd is
installed nearly everwhere X is.  xwd-format images are documented by the
header file X11/XWDFile.h.  This program works in a pipeline to convert certain
xwd-format images to postscript.  You can use it something like this:
$ xwd | python xwdtops.py | lpr
.. it should print a greyscale rendition of the clicked window to the default
printer, if it accepts postscript.

It's been quite awhile since I wrote this program (and later re-wrote it
in C because it's a bit slow), so I'm not really familiar with this code
anymore.  However, I do believe that it works on common 16 and 32-bit X
displays.

One more thing --- if you have imagemagick installed, you may want to consider
using its command import instead.  Instead of the xwd format, it can write
the image in many formats, instead of just xwd.

Jeff

#---
import struct, sys

print %!PS-Adobe-1.0
def get_shift(n):
for i in range(32):
if n  (1i):
return i

def struct_read(f, fmt):
sz = struct.calcsize(fmt)
return struct.unpack(fmt, f.read(sz))

header_format = !25I
color_format = !IHHHBB

header_size = struct.calcsize(header_format)

header = struct_read(sys.stdin, header_format)

(header_size1, file_version, pixmap_format, pixmap_depth, pixmap_width, 
 pixmap_height, xoffset, byte_order, bitmap_unit, bitmap_bit_order,
 bitmap_pad, bits_per_pixel, bytes_per_line, visual_class, red_mask,
 green_mask, blue_mask, bits_per_rgb, colormap_entries, ncolors,
 window_width, window_height, window_x, window_y, window_bdrwidth) = header

if file_version != 7:
raise ValueError, Cannot parse file version %d (only 7) % file_version
if pixmap_format != 2:
raise ValueError, Cannot parse pixel format %d (only ZPixmap, 2) % 
pixel_format

window_name = sys.stdin.read(header[0]-100)[:-1] # discard terminating NUL

print % Undumping, window_name


colors = {}
for i in range(colormap_entries):
color = struct_read(sys.stdin, color_format)
colors[color[0]] = color

rest = sys.stdin.read()

rs = get_shift(red_mask)
gs = get_shift(green_mask)
bs = get_shift(blue_mask)

rsc = .299*256/(red_mask  rs)
gsc = .587*256/(green_mask  gs)
bsc = .114*256/(blue_mask  bs)

print %, red_mask, green_mask, blue_mask
print %, rs, gs, bs
print %, rsc, gsc, bsc
print %, bits_per_pixel
wscale = 558./window_width
hscale = 720./window_height
scale = min(1, wscale, hscale)

rwscale = 558./window_height
rhscale = 720./window_width
rscale = min(1, rwscale, rhscale)
print % scale -, scale, rscale

print /Helvetica findfont 16 scalefont setfont
print 18 756 moveto
print (%s) show %  .join(sys.argv[1:]) or window_name

if scale  rscale:
scale = rscale
#print %d %d translate % (window_height*scale+18, 36)
print %d %d translate % (8.5*72, 0)
print 90 rotate
print 18 %d translate % (594-window_height*scale) # 8.25
sz = 8.5*72
else:
print 18 %d translate % (750-window_height*scale) # 10.5
sz = 11*72

print %d %d scale % (window_width*scale, window_height*scale)

print /picstr %d string def % window_width

bytes_per_pixel = (bits_per_pixel+7)/8
row_format = %c%d%c % ([byte_order],
window_width,
HI[bits_per_pixel  16])
print %, row_format, bytes_per_line, bytes_per_pixel*window_width
print %, len(rest)

print %d %d 8 [%d 0 0 %d 0 0] {currentfile picstr readhexstring pop } image % 
(window_width, window_height, window_width, window_height)

if 0:
print 00* window_width
for row in range(window_height-2):
print 00 + c0 * (window_width-2) + 00
print 00* window_width
else:
for row in range(window_height-1, -1, -1):
a = row * bytes_per_line
b = a + bytes_per_pixel*window_width
for pixel in struct.unpack(row_format, rest[a:b]):
r = (pixel  red_mask)  rs
g = (pixel  green_mask)  gs
b = (pixel  blue_mask)  bs
gray = int(rsc*r+gsc*g+bsc*b)
sys.stdout.write(%02x % gray)
sys.stdout.write(\n)
print
print showpage
#---


pgph6lA0qUdrs.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Tkinter problem

2005-10-31 Thread jepler
On Mon, Oct 31, 2005 at 03:17:05PM -0800, dale cooper wrote:
 Thanks, but I've got another question:
 
 can't find Tcl configuration script tclConfig.sh

This file comes from the following package:
$ rpm -qf /usr/lib*/tclConfig.sh 
tcl-devel-8.4.9-3

Fedora generally splits packages which are libraries into foo and foo-devel
(and maybe others).

Jeff


pgpNF5sPkcOqr.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Where to save classes? How to access classes?

2005-10-31 Thread jepler
This section of the tutorial discusses the module search path:
http://docs.python.org/tut/node8.html

6.1.1 The Module Search Path

When a module named spam is imported, the interpreter searches for a file 
named
spam.py in the current directory, and then in the list of directories 
specified
by the environment variable PYTHONPATH. This has the same syntax as the 
shell
variable PATH, that is, a list of directory names. When PYTHONPATH is not 
set,
or when the file is not found there, the search continues in an 
installation-
dependent default path; on Unix, this is usually .:/usr/local/lib/python.

Actually, modules are searched in the list of directories given by the 
variable
sys.path which is initialized from the directory containing the input script
(or the current directory), PYTHONPATH and the installation-dependent 
default.
This allows Python programs that know what they're doing to modify or 
replace
the module search path. Note that because the directory containing the 
script
being run is on the search path, it is important that the script not have 
the
same name as a standard module, or Python will attempt to load the script 
as a
module when that module is imported. This will generally be an error. See
section 6.2, ``Standard Modules,'' for more information. 

Jeff


pgpfmXpeuyJhL.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: sys.exit call from pythonw.exe gives error

2005-10-27 Thread jepler
I wrote the following small program:
#---
import sys, Tkinter
t = Tkinter.Tk()
b = Tkinter.Button(command=lambda: sys.exit(0), text=Click to exit)
b.pack()
t.mainloop()
#---
and ran it with pythonw.exe from python 2.3.4 on a machine running Windows NT
4.0.  (I actually used Start  Run and entered d:\python23\pythonw.exe 
x:\app.pyw
rather than clicking on the app.pyw icon, but this shouldn't make a difference)

When the button is clicked, the application exits without giving any error like
the one you described.

Jeff


pgp2abPBqEct6.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Errno 8 Exec format error

2005-10-25 Thread jepler
On Tue, Oct 25, 2005 at 04:11:39PM +0100, Matthew Fowler wrote:
 problem with execution of xhpl  on  AxisProduct:  [Errno 8] Exec format
 error
In this case, it appears that Python is reporting the error of some operating
system call, such as execve.

On my operating system, here's a program which creates an executable file which
is not a valid ELF file.  When it is executed with execve, -1 is returned and
errno is set to ENOEXEC (Exec format error)

#---
import tempfile, os

t, n = tempfile.mkstemp()
os.write(t, \x7fELF\1\1\1\0\0\0\0\0\0\0\0\0\0\0\0)
os.close(t)

os.chmod(n, 0700)
try:
print os.execv(n, ['example'])
finally:
os.unlink(n)
#---

$ python badexec.py
Traceback (most recent call last):
  File badexec.py, line 9, in ?
print os.execv(n, ['example'])
OSError: [Errno 8] Exec format error

Jeff

 Hi there
 
 I have been porting python to the Etrax platform and everything seems to
 be working.
 
 However when I run the program in question I get:
 
 
 Im looking for any help to try and solve this issue. Am I correct in
 thinking that Python is reporting this problem? If so has anybody
 experienced this problem before?
 
 Thank You
 
 Matt
 -- 
 http://mail.python.org/mailman/listinfo/python-list
 


pgpc3VIheL4DC.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: textwidget.tag_bind(name, Any-KeyPress, self.donothing) not working

2005-10-25 Thread jepler
I'm not sure why Tk behaves this way, but you can observe the same behavior
with a wish script.  It would seem that break skips any other scripts
associated with item tags, but still proceeds to bindings at the widget level.
Using a binding with break on the canvas itself may help you get the behavior
you want.


canvas .c -width 70 -height 70
set it [.c create text 20 20 -tags x -text example -anchor nw]
.c bind x KeyPress { puts item binding; break; }
bind .c KeyPress { puts widget binding; break }
bind . KeyPress { puts toplevel binding; break }

pack .c
focus .c
.c focus $it


Jeff


pgp8HO6LWzuTY.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Extention String returning

2005-10-24 Thread jepler
I think that you want to use
return PyString_FromStringAndSize(buf, 8);

Jeff


pgp3nNxegNjmk.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: TK question

2005-10-21 Thread jepler
In the FileDialog module there are both LoadFileDialog and SaveFileDialog.  Is
the latter what you want?

Jeff


pgptzMbfYw5VI.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: C replacement for Queue module

2005-10-21 Thread jepler
does collections.deque have a blocking popleft()?  If not, it's not very
suitable to replace Queue.Queue.

Jeff


pgp9S3BEmciKx.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Set an environment variable

2005-10-20 Thread jepler
In Unix, you generally can't affect the environment of your parent program (in
a broad sense, which includes environment variables, current working directory,
opened files, effective user ID, etc).

You have two basic choices to achieve an effect like this.  First, you can
start a subshell with the desired environment, something like (untested)
os.environ['VARIABLE'] = 'value'
os.system(os.environ['shell'])
(commands like 'su' work in this way)

Second, you can produce shell commands that have the effect of changing a
shell's environment when they are executed.  Something like:
print VARIABLE=value
To use this, the user must write something like
eval `myscript.py`
instead of just
myscript.py
this can typically be encapsulated in a shell alias or function.
(commands like 'resize' (which sets the shell's idea of a terminal's size) work
this way)

Finally, you might be able to use an OS-specific interface like linux' ptrace
to change the actual contents of a calling process's memory.  I didn't
immediately find an example of this, but on Linux it would consist of using
PTRACE_PEEKDATA and PTRACE_POKEDATA to locate the environment in another
process and modify it.  The ptrace interface is not available from any standard
Python module, and isn't portable anyway. (though my manpage actually says
'CONFORMING TO SVr4, ..., X/OPEN, BSD 4.3' so maybe ptrace is more portable
than I believed)

Jeff


pgpGRSQal48ZE.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: nested escape chars in a shell command

2005-10-20 Thread jepler
I think you're mistaken about how 'sh -c' works.  The next argument after -c 
is
the script, and following arguments are the positional arguments. (what, you've
never used -c in conjunction with positional arguments?  me either!)

Example:

$ /bin/sh -c 'echo $#' a b c

# i.e., a blank line
$ /bin/sh -c 'echo $# 0=$0 1=$1 2=$2' a b c
2 0=a 1=b 2=c
# i.e., a, b, c went to positional arguments


Additionally, unless pexpect.spawn behaves differently than os.spawnv,
-c is actually going to /bin/sh's argv[0], and you end up trying to execute
/usr/bin/ssh as a shell script, which is probably not what you want!


def shellquote(arg):
# shell quoting technique I first read about on the 'git' development list
# Everything is safely quoted inside a ''-quoted string, except a ' itself,
# which can be written as '\'' (a backslash-escaped ' outside of the 
''-quoted
# string)
return ' + arg.replace(', '\\'') + '

def shellquotelist(args):
return  .join([shellquote(arg) for arg in args])

# XXX: you may wish to assemle 'command' using shellquotelist too
command1 = shellquotelist(['/bin/sh', '-c','/usr/bin/ssh','-t','-o',
'StrictHostKeyChecking no',host,command])
command2 = shellquotelist(['awk','{print %s:$0}'%host])

child = \
pexpect.spawn('/bin/sh',
args=['/bin/sh', '-c', command1 + | + command2],
timeout=30)


Finally, in your case the use of awk would seem to be gratuitous.  Instead,
prepend the hostname to each line when you read the lines in.  (this could easy
or hard depending on the structure of the code where you read the output
generated by child---if you do it with readline() or by iterating over the file,
it is probably easy)

Jeff


pgp6UVusIacVl.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

os.makedirs should not succeed when the directory already exists (was Re: Python Doc Error: os.makedirs)

2005-10-20 Thread jepler
On Wed, Oct 19, 2005 at 09:26:16AM -0700, Dr. Who wrote:
 The fact that the directory already exists is irrelevant to the function...it
 still failed to create the directory.

That's not true.  Imagine that os.makedirs() is used inside tempfile.mkdtemp()
(I looked, and it isn't) and the proposed behavior (do not raise an exception
when the directory already exists) is adopted.

In this case, there is a race condition between you and the attacker who
guesses the next directory you will attempt to make.  If he calls mkdir()
before you do, then your os.makedirs() returns successfully (instead of raising
an exception) and you place your files into a location that is under the
control of someone else.

If the attacker then makes the directory setuid himself, that files created in
the directory are owned by him.  Now, he can view and change the contents of
these files.  This can lead to a local priviledge escalation.

Errors should never pass silently.
Unless explicitly silenced.
-- from the Zen of Python ('import this')
... and wanting them to do so may introduce a security bug in your software.

If you know more about your users and their environments than I do (for
instance, that none of them will ever use a multi-user computer system) maybe
you should choose to wrap os.makedirs with something that silences EEXIST.
But I'm glad Python does the secure thing and treats EEXIST as a failure by 
default.

Jeff


pgpWhf794NILT.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Bloodhound.Exploit.49 trojan found in MIMEBase.pyc

2005-10-18 Thread jepler
It's almost certainly a false positive.  In my day job we run into false
positive antivirus detections like this once or twice a year, and
typically get a runaround from the AV vendor (who often have the gall to
suggest that we should buy a copy of their broken software before
they'll fix their problems)

Jeff


pgpjaq8H7Vm4a.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: reading hebrew text file

2005-10-17 Thread jepler
I looked for VAV in the files in the encodings directory
(/usr/lib/python2.4/encodings/*.py on my machine).  I found that the following
character encodings seem to include hebrew characters:
cp1255
cp424
cp856
cp862
iso8859-8
A file containing hebrew text might be in any one of these encodings, or
any unicode-based encoding.

To open an encoded file for reading, use
f = codecs.open(file, 'r', encoding='...')
Now, calls like 'f.readline()' will return unicode strings.

Here's an example, using a file in UTF-8 I have laying around:
 f = codecs.open(/users/jepler/txt/UTF-8-demo.txt, r, utf-8)
 for i in range(5): print repr(f.readline())
... 
u'UTF-8 encoded sample plain-text file\n'
u'\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\u203e\n'
u'\n'
u'Markus Kuhn [\u02c8ma\u02b3k\u028as ku\u02d0n] [EMAIL PROTECTED] \u2014 
1999-08-20\n'
u'\n'

Jeff


pgpIIx2zTStwL.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Python's garbage collection was Re: Python reliability

2005-10-12 Thread jepler
On Mon, Oct 10, 2005 at 08:37:03PM +0100, Tom Anderson wrote:
 So python doesn't use the old SmallTalk 80 SmallInteger hack, or similar? 
 Fair enough - the performance gain is nice, but the extra complexity would 
 be a huge pain, i imagine.

I tried to implement this once.  There was not a performance gain for general
code, and I also made the interpreter buggy in the process.

I wrote in 2002:
| Many Lisp interpreters use 'tagged types' to, among other things, let
| small ints reside directly in the machine registers.
| 
| Python might wish to take advantage of this by designating pointers to odd
| addresses stand for integers according to the following relationship:
| p = (i1) | 1
| i = (p1)
| (due to alignment requirements on all common machines, all valid
| pointers-to-struct have 0 in their low bit)  This means that all integers
| which fit in 31 bits can be stored without actually allocating or deallocating
| anything.
| 
| I modified a Python interpreter to the point where it could run simple
| programs.  The changes are unfortunately very invasive, because they
| make any C code which simply executes
| o-ob_type
| or otherwise dereferences a PyObject* invalid when presented with a
| small int.  This would obviously affect a huge amount of existing code in
| extensions, and is probably enough to stop this from being implemented
| before Python 3000.
| 
| This also introduces another conditional branch in many pieces of code, such
| as any call to PyObject_TypeCheck().
| 
| Performance results are mixed.  A small program designed to test the
| speed of all-integer arithmetic comes out faster by 14% (3.38 vs 2.90
| user time on my machine) but pystone comes out 5% slower (14124 vs 13358
| pystones/second).
| 
| I don't know if anybody's barked up this tree before, but I think
| these results show that it's almost certainly not worth the effort to
| incorporate this performance hack in Python.  I'll keep my tree around
| for awhile, in case anybody else wants to see it, but beware that it
| still has serious issues even in the core:
|  0+0j
| Traceback (most recent call last):
|   File stdin, line 1, in ?
| TypeError: unsupported operand types for +: 'int' and 'complex'
|  (0).__class__
| Segmentation fault
| 
| 
http://mail.python.org/pipermail/python-dev/2002-August/027685.html

Note that the tree where I worked on this is long since lost.

Jeff


pgp73wpVIhmAA.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: dictionnaries and lookup tables

2005-10-11 Thread jepler
On Tue, Oct 11, 2005 at 11:06:32AM -0700, [EMAIL PROTECTED] wrote:
 Note that when I type:
 dir(D)
[...]
 the functions __ge__, __gt__, __lt__, __le__ seem to be non-implemented
 but there is some __doc__ in them. Is there the intention to do
 something similar as is described above or are they here for some
 (future) dictionnary comparison purposes?

Sure they're implemented.  That's why I can compare dictionaries for equality
or order.

 d = {1: None}
 e = {1: None}
 f = {2: None}
 d == e
True
 d == f
False
 d  f or f  e
True

If the operation you need to optimize is find the largest element that is
smaller than X, then perhaps you want to use the bisect module.  This involves
keeping your information in a sorted list of tuples, instead of in a
dictionary.  However, removing or inserting items has O(n) complexity instead
of O(1).

Jeff


pgpoNBi46YeD2.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: unable to import os

2005-10-11 Thread jepler
Concatenating filenames with + is seldom what you want.

Instead, you should use os.path.join (or, to decrease portability, 
nt.path.join).

Jeff


pgpUKTuVnB2qh.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Profiling Python using gprof

2005-10-11 Thread jepler
It should be the same as for any program

$ program-compiled-with-pg
$ gprof /path/to/program-compiled-with-pg

you'll need to make sure that python is not only *compiled* with -pg
but that the *link line* contains -pg as well.  That's a common gotcha when
it comes to profiling.

Jeff


pgpQyzwYpYrtn.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: are there internal functions for these ?

2005-10-11 Thread jepler
there's 'os.rename' for moving (single) files, and several functions in
'shutil' for moving and copying trees of files.

Jeff


pgpS5MgPvRJQZ.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: [PIL]: Question On Changing Colour

2005-10-11 Thread jepler
If you're always going from grey to tinted, then the easiest way is to 
treat it as a 'P' image with a special palette.

I believe this function will prepare the palette:
def make_palette(tr, tg, tb):
l = []
for i in range(255):
l.extend([tr*i / 255, tg*i / 255, tb*i / 255])
return l

Here's an example:
import Image

A, B, C = map(chr, [64, 128, 192])
i = Image.fromstring(
'P', (4,4), ''.join([
B,B,B,B,
B,C,C,A,
B,C,C,A,
B,A,A,A]))
i.putpalette(make_palette(64,64,255))
i.show()

Jeff


pgp0XmK9KEsfO.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Wanted: Python module allowing direct access to raw sectors of harddrives (MFT, boot sector, etc.) in MS Windows

2005-10-10 Thread jepler
I took the advice from this web page:
http://support.microsoft.com/kb/q100027/
(I don't know how this extends to floppies, and the 9x family of OSes isn't
listed in applies to, so this may not help your case)

Here, I open physical drive 0 and see that the magic number indicates a valid
boot record.  I believe it is the MBR.

 f = open('.\\PhysicalDrive0', 'rb')
 f.read(512)[-2:]
'U\xaa'   # that is, hex 55 AA

I don't know much about low-level filesystem or partition details--I got the
tidbit about the 55 AA magic number from 

http://www-uxsup.csx.cam.ac.uk/pub/doc/suse/sles9/adminguide-sles9/ch08.html

Jeff


pgpGGGmmqn6Yd.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Python name lookups

2005-10-10 Thread jepler
On Mon, Oct 10, 2005 at 03:02:30PM -0700, Dave wrote:
 Hello All,
 
 As far as I understand, Python deals with a lot of
 string objects, i.e. it looks up all names. Is there a
 way to find out how many name lookup operations take
 place in a Python program? Is it the name lookup
 operation or hash operation that degrades performance?
 What function does Python use for name lookup
 operations? Is it the lookdict function in
 Objects/dictobject.c?

lookdict_string is used for most lookups of the form
obj.attr
because they are never found to have non-string keys
entered or searched.

Furthermore, most of these string keys are interned,
which I believe makes the check
if (ep-me_key == NULL || ep-me_key == key)
return ep;
return a result without comparing the contents of the strings.

Using gdb, I tried to get a rough estimate of how often pystone calls
_PyString_Eq while running a benchmark program, compared to how many
times it calls lookdict_string.  Here's a simplified gdb session:
$ gdb ./python
(gdb) break _PyString_Eq
(gdb) ignore 1 10
(gdb) break lookdict_string
(gdb) ignore 2 10
(gdb) r Lib/test/pystone.py 200
Pystone(1.1) time for 200 passes = 0.13
This machine benchmarks at 1538.46 pystones/second
(the low score is because of the overhead of gdb breaking on those functions)
(gdb) info b
Num Type   Disp Enb AddressWhat
1   breakpoint keep y   0x0807e126 in _PyString_Eq
breakpoint already hit 4040 times
2   breakpoint keep y   0x0807573c in lookdict_string
breakpoint already hit 57254 times
So there seem to be less than .1 string comparisons per name lookup.

In fact, for 200 or for 5 passes, there are still just 4040 calls to
_PyString_Eq, which would give .003 string comparisons per name lookup,
assuming the numbers for lookdict_string scale with the number of passes.

Jeff


pgpSzIG9XJIPN.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: pyparallel and MAKE controller board for CRYDOM AC/DC switches

2005-10-10 Thread jepler
Recalling the parallel pinout, pin 3 is data bit 2.  Have you tried
def BIT(x): return 1x
p.setData(BIT(2))
?



pgprfRaNUTBBH.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Why asci-only symbols?

2005-10-10 Thread jepler
I'm not aware of any PEPs on the subject, but google groups turns up some past
threads.  Here's one from February 2004:

http://groups.google.com/group/comp.lang.python/browse_frm/thread/d5fcc1c8825a60dc/96856af647ce71d5
I didn't immediately find this message of Guido's that everyone's talking about
as this thread began, though.

Jeff


pgpIReeQj97C5.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Looking for info on Python's memory allocation

2005-10-10 Thread jepler
While there may be a discussion somewhere in the archives,
the comments in listobject.c are enlightening too.

/* Ensure ob_item has room for at least newsize elements, and set
 * ob_size to newsize.  If newsize  ob_size on entry, the content
 * of the new slots at exit is undefined heap trash; it's the caller's
 * responsiblity to overwrite them with sane values.
 * The number of allocated elements may grow, shrink, or stay the same.
 * Failure is impossible if newsize = self.allocated on entry, although
 * that partly relies on an assumption that the system realloc() never
 * fails when passed a number of bytes = the number of bytes last
 * allocated (the C standard doesn't guarantee this, but it's hard to
 * imagine a realloc implementation where it wouldn't be true).
 * Note that self-ob_item may change, and even if newsize is less
 * than ob_size on entry.
 */
[...]
/* This over-allocates proportional to the list size, making room
 * for additional growth.  The over-allocation is mild, but is
 * enough to give linear-time amortized behavior over a long
 * sequence of appends() in the presence of a poorly-performing
 * system realloc().
 * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
 */
linear-time amortized behavior (i.e., that list.append() is O(1) on average)
is the important characteristic you're probably looking for.

CVS source for listobject.c can be seen here:

http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Objects/listobject.c?rev=2.227view=markup

Jeff


pgp4hldyPHMvN.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: non descriptive error

2005-10-09 Thread jepler
On Mon, Oct 10, 2005 at 09:12:13AM +1000, Timothy Smith wrote:
 FAYI i have already found it and it was a wrongly indented code block :/

When indentation leaves an illegal program structure, Python gives a very
informative error message, such as

  File /tmp/x.py, line 3
return 3
   ^
IndentationError: unindent does not match any outer indentation level

Jeff


pgpQJn4I7qnof.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Idle bytecode query on apparently unreachable returns

2005-10-09 Thread jepler
On Mon, Oct 10, 2005 at 12:20:13AM +0100, Tom Anderson wrote:
 What puzzles me, though, are bytecodes 17, 39 and 42 - surely these aren't 
 reachable? Does the compiler just throw in a default 'return None' 
 epilogue, with routes there from every code path, even when it's not 
 needed? If so, why?
I think the short answer is yes.  They're unreachable, and they're thrown in
by default.

It's possible that this could be fixed with a slightly smarter compiler, but
the performance difference is likely to be in the noise.  What's one cache miss
(because the bytecode is slightly larger) compared to the total cycles used
in, say, the LOAD_GLOBAL 'fib'?

My bet is that this optimization would not pay off in measurable run-time
gains.

Jeff


pgpPYgLkYVBPg.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Function decorator that caches function results

2005-10-08 Thread jepler
On Sat, Oct 08, 2005 at 01:53:28PM +, Duncan Booth wrote:
 Unless the results stored in the cache are very large data structures, I 
 would suggest that you simply store (args,kwargs) as the cache key and 
 accept the hit that sometime you'll cache the same call multiple times.

... except that dicts cannot be dict keys

Another 'memoize' decorator uses this to get the key:
kw = kwargs.items()
kw.sort()
key = (args, tuple(kw))
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/325905

Jeff


pgp4a5R0heoxU.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: List performance and CSV

2005-10-08 Thread jepler
You'll probably see a slight speed increase with something like
for a in CustomersToMatch:
for b in Customers:
if a[2] == b[2]:
a[1] = b[1]
break
But a really fast approach is to use a dictionary or other structure
that turns the inner loop into a fast lookup, not a slow loop through
the 'Customers' list.  Preparing the dictionary would look like
custmap = {}
for c in Customers:
k = c[2]
if k in custmap: continue
custmap[k] = c
and the loop to update would look like
for a in customerstomatch:
try:
a[1] = custmap[a[2]][1]
except KeyError:
continue

(all code is untested)

In big-O terms, I believe this changes the complexity from O(m*n) to O(m+n).

Jeff


pgpiNVhiQU0Jm.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: 2d array slicing problem

2005-10-07 Thread jepler
Do you have a simple program that demonstrates the problem?

I have an x86 machine with Python 2.3, and an x86_64 machine with Python 2.4
available.  I wrote a simple test program which performs a slice operation,
but it behaves the same on both platforms.

Here's the program:
#
import numarray, sys, os
print python:  , sys.version_info 
print numarray:, numarray.__version__
print CPU: , os.uname()[-1]

n = numarray.arange(10)
o = numarray.outerproduct(n,n)
p = o[3:7,6:10].copy()
q = numarray.outerproduct([3,4,5,6], [6,7,8,9])
print Success: , numarray.alltrue(p.ravel() == q.ravel())
#

Here are the two results I gathered:

python:   (2, 4, 1, 'final', 0)
numarray: 1.3.3
CPU:  x86_64
Success:  True

python:   (2, 3, 2, 'final', 0)
numarray: 0.9
CPU:  i686
Success:  1

Jeff


pgpBMzxSrksM3.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: how to debug when Segmentation fault

2005-10-05 Thread jepler
Interesting.  I'd noticed that the metaclass one didn't crash my 2.2, but I
didn't check the marshal one.

This one core dumps in 'Python 2.2.2 (#1, Feb 24 2003, 19:13:11) ... linux2'
but inexplicably prints 'keys' when I ran it on the 2.4.1 I used in my last
post.

 import marshal
 f = lambda: None
 d = marshal.dumps(f.func_code).replace('\0\0S', '~~S')
 f.func_code = marshal.loads(d)
 f()

This crashes both my 2.2.2 and 2.4.1:
 import marshal
 f = lambda: None
 d = marshal.dumps(f.func_code).replace('\0\0S', '\xff\xffS')
 f.func_code = marshal.loads(d)
 f()

Jeff


pgpHJKzMCPaq6.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: How to create temp file in memory???

2005-10-05 Thread jepler
Here's how:

1. open your web browser
2. visit the url http://docs.python.org
3. click the link Library Reference (keep this under your pillow)
4. scan down the list of modules until you see these two items:
4.6 StringIO -- Read and write strings as files
4.7 cStringIO -- Faster version of StringIO 
5. ?
6. profit

Jeff


pgpH8v1zzL5Ma.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: updating local()

2005-10-05 Thread jepler
I'm surprised you found any example of 'locals().update' that worked.
Here's one that doesn't work:
def f(y):
locals().update({'x': y})
return x

print f(3)  # prints 3?

Jeff


pgpLVe48NBWmT.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Newbie regular expression ?

2005-10-04 Thread jepler
Here are two ideas that come to mind:
files = glob.glob(UNQ*.dat) + glob.glob(Unq*.dat) + glob.glob(unq.dat)

files = [f for f in glob.glob(*.dat) if f[:3] in (UNQ, Unq, unq)]

Jeff


pgp30Rue2EGi7.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: how to debug when Segmentation fault

2005-10-04 Thread jepler
I've rewritten your middle example to be clearer.
$ python2.4
Python 2.4.1 (#1, May 16 2005, 15:15:14) 
[GCC 4.0.0 20050512 (Red Hat 4.0.0-5)] on linux2
Type help, copyright, credits or license for more information.
 type(Y, (type,), {mro: lambda x: [float]})(X, (), {})

and here's another one for you to enjoy:
 import marshal
 f = lambda: None
 code = 
 marshal.loads(marshal.dumps(f.func_code).replace('d\0\0S','d\xff\xffS'))
 f.func_code = code
 f()

Jeff


pgpJRlU4jt6JK.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: how to get any available port

2005-10-04 Thread jepler
Apparently, calling bind() with a zero port will choose some available port
number, as demonstrated by this program:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((, 0))
print s.getsockname()

Here's how it behaved over several runs:
$ python soc.py 
('0.0.0.0', 34205)
$ python soc.py 
('0.0.0.0', 34206)
$ python soc.py 
('0.0.0.0', 34207)

I don't know for sure whether this is standard behavior for sockets, or whether
it's a special behavior of linux.

Jeff


pgpdXrF07MIY9.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: how to get any available port

2005-10-04 Thread jepler
On Tue, Oct 04, 2005 at 05:19:37PM -0400, Mohammed Smadi wrote:
 what else would you do?  I am using examples from the web and they all 
 bind to a port at the localhost before connecting to the remote host.
[...]

the web must be stupider than I thought.

Here's how Python's own ftplib connects to an ftp server (dedented for clarity):
try:
self.sock = socket.socket(af, socktype, proto)
self.sock.connect(sa)
except socket.error, msg:
...

there's no need to call bind() before connect.

Jeff


pgpHhphJklBxU.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Convert hex to string

2005-10-03 Thread jepler
it *is* a string.

because most of the characters are not printable, they're presented using hex
notation when you repr() the string.  That's what entering an expression in the
interactive interpreter does (except that it never prints 'None').

If you really want to write whatever those bytes are, then do something like
 print x
or 
 sys.stdout.write(x)

Jeff


pgpmf6usUJ6jW.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Exception raising, and performance implications.

2005-10-03 Thread jepler
As for performance, you'll need to benchmark it.

However, I think the functionality you're asking for is available as
inspect.currentframe(), and if the implementation is in C it may have a tiny
performance advantage over the Python version.

Jeff


pgpENIs7apfaF.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Exception raising, and performance implications.

2005-10-03 Thread jepler
On Mon, Oct 03, 2005 at 02:34:40PM -0700, leo wrote:
 I come from a java background, where Exceptions are a big Avoid Me, but
 are the performance implications the same in Python? We're expecting a
 big load on our app (100,000 users/hour) , so we'd like to be as tuned
 as possible.

I don't know what you do for each user, but here's a data point:  My 1.8GHz
Sempron (firmly in the budget category) uses a fairly unoptimized piece of
software called aether[1] to serve my blog and a few other things.  It uses
Apache and good old fashioned cgi-bin one-process-per-request to serve up most
pages.  It parses a substantial amount of Python code each time with execfile
(not using byte-compiled files).  It still does this in 87ms on average (albeit
for a simple page), or about 41k requests per hour.

By simply buying a faster CPU, or by avoiding execfile, or by using a
higher-performance technology than CGI, or with judicious use of caching, I'm
sure I could reach 100,000 requests per hour, and by using several of the
techniques together I might be able to reach 400k requests per hour.  Probably
it would be after these fairly obvious, high-level optimization ideas were
exhausted that I would look at the code at a microscopic level for optimization
ideas.

But because my website is stuck on the slow end of a DSL line, there's not much
point to any of this.

Jeff
[1] http://www.logarithmic.net/pfh/aether (not my site)


pgpnD6QduJu28.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Statement orders

2005-10-02 Thread jepler
Here's one case where it's bad to call update.

def perform_longrunning_calculation():
time.sleep(1)
app.update()
time.sleep(1)

suppose you kick this off with a keybinding, such as:
app.bind(c, lambda e: perform_longrunning_calculation())
the calculation takes 2 seconds, and after 1 second update() is called,
possibly to make sure that the user interface is repainted.

But imagine that in the first second, c has been pressed.  That event will
be handled, and perform_longrunning_calculation will be entered *again*,
recursively.  The nesting looks something like this:
  app's mainloop
handling keypress
  perform_longrunning_calculation()
app.update()
  handling keypress
perform_longrunning_calculation()
by calling update_idletasks instead of update, the keypress event is not
handled, so it's impossible to enter perform_longrunning_calculation a
second time.

Jeff


pgpF8UhzLmmsd.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Statement orders

2005-10-02 Thread jepler
 would it be advisable to guard against this with something like this?
 
 def perform_longrunning_calculation():
  if not app.busy:
  app.busy = 1
[...]
By using that kind of construct, instead of using update_idletasks(), 
you force all code to be aware of and manage the app.busy flag.

Another difference is that with the original code changed to use
update_idletasks(), perform_longrunning_calculation *will* be called
twice, the second time after the first one completes.  With your code,
it will be called once if the second keypress comes within one second, and
twice if called after one second is up. (though a second update before setting
busy back to false will make it be called only once)

So in also depends on what you want your application to do in these cases.

Jeff


pgpZrbYdr8Uyk.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Printing and prompting adds a mysterious extra space

2005-10-01 Thread jepler
Use sys.stdout.write instead of print.  It will solve these problems you are
having.

If you really want to know what's going on, read the language manual,
http://docs.python.org/ref/print.html It explains the behavior of this extra
space, which is output by a successive 'print' statement.  The implementation
uses an attribute called 'softspace', which is described in
http://docs.python.org/lib/bltin-file-objects.html 

Jeff


pgpRTjpCVfUyv.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Wits end with Python and cron

2005-09-28 Thread jepler
You need to export the variables.  otherwise, they exist only in the shell,
not in the processes it starts.

Jeff


pgplXE5VuF44A.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Getting a number out of a string

2005-09-27 Thread jepler
You can index into a string:
 s = '06897'
 s[2]
'8'

You can also turn each character into an integer, in various ways:
 [int(c) for c in s]
[0, 6, 8, 9, 7]
 map(int, s)
[0, 6, 8, 9, 7]

Jeff


pgpDMq5e3RucB.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Human readable number formatting

2005-09-27 Thread jepler
Compared to your program, I think the key to mine is to divide by limit
before taking the log.  In this way, things below the limit go to the next 
lower integer.

I think that instead of having 'step' and 'base', there should be a single
value which would be 1000 or 1024.

import math

def MakeFormat(prefixes, step, limit, base):
def Format(n, suffix='B', places=2):
if abs(n)  limit:
if n == int(n):
return %s %s % (n, suffix)
else:
return %.1f %s % (n, suffix)
magnitude = math.log(abs(n) / limit, base) / step
magnitude = min(int(magnitude)+1, len(prefixes)-1)

return '%.1f %s%s' % (
float(n) / base ** (magnitude * step),
prefixes[magnitude], suffix)
return Format

DecimalFormat = MakeFormat(
prefixes = ['', 'k', 'M', 'G', 'T'],
step = 3,
limit = 100,
base = 10)


BinaryFormat = MakeFormat(
prefixes = ['', 'ki', 'Mi', 'Gi', 'Ti'],
step = 10,
limit = 100,
base = 2)

values = [0, 1, 23.5, 100, 1000/3, 500, 100, 12.345e9]
print [DecimalFormat(v) for v in values]
print [BinaryFormat(v) for v in values]


pgpJgQXD2YDZW.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Using '__mul__' within a class

2005-09-24 Thread jepler
For the same reason that
def f(z):
z *= z
c = 1
f(c)
print c
prints 1.

Jeff


pgpF5jQBO3otJ.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Using '__mul__' within a class

2005-09-24 Thread jepler
Oops!

I should have used '2' in the example, or some other number.

I was trying to make a point about what
x *= ...
means when it is in the context of a function (or method) body.
I think this is key to understanding what Python did in the case the user 
posted.

Being rude wasn't my intent at all.

Jeff


pgpLp61GyJ0st.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: subprocess.Popen and replacing the shell pipe line

2005-09-22 Thread jepler
Probably the quoting of the argument to grep.
try this instead:
 p1 = Popen(['grep', 'Sep 22', '/var/log/auth.log'], stdout=PIPE)
etc

Jeff
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: execfile eats memory

2005-09-19 Thread jepler
I generated a ~22-megabyte file with this small Python program:
print [
for i in xrange(200):
print ' + str(i) + ', 
print ]

As the original poster suggested, Python uses at least several hundreds
of megabytes when execfile()ing that source.  I had to kill the program
before it exited because it brought my computer (1GB RAM) to a standstill.

Jeff


pgpbtoKevjhNM.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: reading files with error

2005-09-18 Thread jepler
On Sun, Sep 18, 2005 at 02:15:00PM +1000, Maurice Ling wrote:
 Sorry but what are SEEK_END and SEEK_SET?

Oops, that's what I get for snipping a part of a larger program.

SEEK_SET = 0
SEEK_END = 2

Jeff


pgpC1OTox5VvO.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: How to obtain a 'interactive session' of a script?

2005-09-18 Thread jepler
The 'code' module contains 'Utilities needed to emulate Python's interactive
interpreter.'.  By subclassing code.InteractiveConsole and replacing the
raw_input method with one which reads from a file, I think you can get what you
want.

The example below the classes uses StringIO so that it can be self-contained,
but you'll probably use a regular file instead.

import code, sys

class BoPeng(code.InteractiveConsole):
def __init__(self, locals=None, filename=console, file = None):
self.file = file or open(filename)
code.InteractiveConsole.__init__(self, locals, filename)

def raw_input(self, prompt):
l = self.file.readline()
if l == '': raise EOFError
sys.stdout.write(prompt + l)
return l.strip(\n)

session = '''\
print 3+3
for i in range(10):
print i

print Example of a traceback:
1/0
'''

import StringIO
b = BoPeng(file = StringIO.StringIO(session))
b.interact(None)


pgpfYnuQODMMd.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: reading files with error

2005-09-17 Thread jepler
I have written a program to do something similar.  My strategy is:
 * use os.read() to read 512 bytes at a time
 * when os.read fails, seek to the next multiple of 512 bytes
   and write '\0' * 512 to the output
I notice this code doesn't deal properly with short reads, but in my experience
they never happen (because the disk error makes an entire block unreadable, and
a block is never less than 512 bytes)

I use this code on a unix-style system.

def dd(src, target, bs=512):
src = os.open(src, os.O_RDONLY)
if os.path.exists(target):
target = os.open(target, os.O_WRONLY | os.O_APPEND, 0600)
existing = os.lseek(target, 0, SEEK_END)
else:
existing = 0
target = os.open(target, os.O_WRONLY | os.O_CREAT, 0600)

total = os.lseek(src, 0, SEEK_END) / bs
os.lseek(src, existing, SEEK_SET)
os.lseek(target, existing, SEEK_SET)

if existing: print starting at, existing
i = existing / bs
f = 0
lastrem = -1

last = start = time.time()
while 1:
try:
block = os.read(src, bs)
except os.error, detail:
if detail.errno == errno.EIO:
block = \0 * bs
os.lseek(src, (i+1) * bs, SEEK_SET)
f = f + 1
else:
raise  
if block == : break

i = i + 1
os.write(target, block)

now = time.time()
if i % 1000 or now - last  1: continue
last = now

frac = i * 1. / total
rem = int((now-start) * (1-frac) / frac)
if rem  60 or abs(rem - lastrem)  .5:
rm, rs = divmod(rem, 60)
lastrem = rem
spd = i * 512. / (now - start) / 1024 / 1024
sys.stderr.write(%8d %8d %8d %3.1f%% %6d:%02d %6.1fMB/s\r
% (i, f, i-f, i * 100. / total, rm, rs, spd))
sys.stderr.write(\n)


pgpsinNQxCisS.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: socket.gethostbyaddr problem

2005-09-17 Thread jepler
Perhaps you mean to use the function socket.gethostbyname instead.

 import socket
 socket.gethostbyaddr(www.google.ca)
Traceback (most recent call last):
  File stdin, line 1, in ?
socket.herror: (1, 'Unknown host')
 socket.gethostbyname(www.google.ca)
'64.233.167.147'

Jeff


pgpsZ1m3OcqVP.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

pybwidget release 0.1.2

2005-09-15 Thread jepler
pybwidget is a Python wrapper around the 'bwidget' family of widgets for
Tkinter.  It includes these classes:
Entry Label Button ArrowButton ProgressBar ScrollView Separator
MainFrame LabelFrame TitleFrame PanelFrame ScrolledWindow
ScrollableFrame PanedWindow ButtonBox PagesManager NoteBook Dialog
StatusBar LabelEntry ComboBox SpinBox Tree ListBox MessageDialog
ProgressDialog PasswordDialog SelectFont SelectColor 

I know it's been a long time, but I've finally gotten around to making a
new release of pybwidget, called 0.1.2_1.7.0.

It has all the fixes I could find that have been mentioned in the
tkinter-discuss mailing list archives.  Compared to 0.1.1, here's a
summary of changes:
* add ROOT as a module-level constant, as requested
* bindtabs, bind_image, bind_text all handle the 'func' parameter
  properly
* several instances of 'self.tl' corrected to 'self.tk'
* the 'nodes' function of the Tree widget now passes all arguments
  to Tk
* The xbm-format images are installed by setup.py
* how to run setup.py is mentioned in README.html

This release is available at
http://tkinter.unpythonic.net/bwidget

Please report your experiences, good or bad, on the Tkinter mailing list
tkinter-discuss@python.org 

Jeff Epler
[EMAIL PROTECTED]


pgpidcZT87hcU.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-announce-list

Support the Python Software Foundation:
http://www.python.org/psf/donations.html


Re: Creating Pie Chart from Python

2005-09-15 Thread jepler
There are many.

One choice would be Tkinter's Canvas.

def frac(n): return 360. * n / 500

import Tkinter
c = Tkinter.Canvas(width=100, height=100); c.pack()
c.create_arc((2,2,98,98), fill=red, start=frac(0), extent = frac(100))
c.create_arc((2,2,98,98), fill=blue, start=frac(100), extent = frac(400))
c.create_arc((2,2,98,98), fill=green, start=frac(400), extent = frac(100))
c.mainloop()

Jeff


pgpAfjUXdmJWm.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

  1   2   >