Create Web app on Win and run on Win or Mac
I took a look at Ren'Py as suggested by a reply to my previous post entitled Create on Win and run on Win or Mac. Thanks for your suggestion. Ren'Py looks pretty amazing! Not sure that is a good route since my primary reason for this endeavor is learning Python scripting (secondarily to create the game) and Ren'Py uses it's own scripting language. Also not sure that Ren'Py supports Win 64-bit machines. Now I am switching course slightly and would like to write a Python based web app on a Windows machine, have it run locally and display the app in the browser. The finished product would be run on other Windows machines (of varying Windows OS versions) and also on Mac machines (of varying Mac OS versions.) The program would present a browser based GUI that the user would interact with (keying in integer data and clicking buttons) and would only have simple computations behind the scenes. I would like to only do the creation work once and do it on a Windows machine (I do not have access to a Mac.) Then be able to run on both other Win machines and Mac machines with only doing a simple (or not any) installation and without requiring an existing Python installation. Also, I do not want the user to need to remain connected to the I-net to use the app. If they need to connect to the I-net initially to download it that would be OK, as long as they could disconnect immediately afterwards and still use the app. I am sure that I could do something in JavaScript and/or AngularJS, maybe a single page app, but I want to do it in Python since that is what I am trying to learn. It would be OK if it had a small amount of JavaScript, but most of it needs to Python. Is this possible? If so, what tools do I use? Can I still use Tkinter for a web app? Do I need to do (use) anything to create cross platform executables or would running in a browser make that step not required? Sorry for the newbie question, but I am obviously looking for a light switch. Thanks,Bret -- https://mail.python.org/mailman/listinfo/python-list
Create on Win and run on Win or Mac
I would like to create a Python (stand-alone executable) program on a Windows machine and deploy the finished product on other Windows machines (of varying Windows OS versions) and also on Mac machines (of varying Mac OS versions.) The program would present a GUI that the user would interact with and would only have simple computations. I looks like I could do the creation work twice (once for Windows and once for Mac) and then also create separate install packages. However, I would like to only do the creation work once and do it on a Windows machine and then be able to deploy to either Win or Mac. I understand that will mean separate intstallation packages due to the different environments. Is this possible? I do not think that it is, but asking just to be sure. If so, what tools do I use to do the packaging? Do I use py2app for the Mac? Thanks, Bret -- https://mail.python.org/mailman/listinfo/python-list
ActiveState/O'Reilly Launch New and Improved Code Share Site (Python)
ActiveState launched today the new code.activestate.com with code recipes for dynamic languages such as Python, Perl and Tcl and web development. This site is great recipe sharing site for all Python, Perl and Tcl developers. O'Reilly will be use recipes from the site for its next Python cook book. Bit.ly link to the blog announcement: http://bit.ly/b1Wkdm -- http://mail.python.org/mailman/listinfo/python-list
Re: tough-to-explain Python
I really enjoyed your boxes analogy, from a guy with a trucking background, it makes a lot of sense! -Bret ... The more I delve into OOP the more I liken an 'object' to a box. A box with a shipping manifest. There are big boxes, little boxes, squat boxes and so on. A box can contain corn flakes, bullets, raisins, rice, burlap, silk, motorcycle(s), soap and more. The manifest describes contents. The manifest is there but the description(s) change with content (type). The descriptions always use one or more of the basics like: color, count, dimension and so forth. Just like an OOP object. A box can contain things of all sorts, including references to the contents of other box(es). A box can even be a virtual of another (the global concept). The return statement, in this context, means hauling the contents of the box (and/or its manifest) back to (wherever) and disposing of the current box (a local). Just like an OOP object. It is easier to visualize a box and it's use than a non described blob. Abstracts are never precise - hence the evolution of the word. The one thing a teacher will always fail is the same as anyone else who tries to adequately describe a pretty sunset to a person born totally blind. No point(s) of reference. Time for me to sign off. To all those that helped me when I needed it - I thank you very much. Food for thought: your watch (clock) does not tell time. The watch (clock) only mimics one movement of the earth. ie... 3 dimensions are still static, the 4th is movement. Steve -- - Bret -- http://mail.python.org/mailman/listinfo/python-list
csv.reader has trouble with comma inside quotes inside brackets
i have a csv file like so: row1,field1,[field2][text in field2 quote, quote],field3,field row2,field1,[field2]text in field2 quote, quote,field3,field using csv.reader to read the file, the first row is broken into two fields: [field2][text in field2 quote and quote while the second row is read correctly with: [field2]text in field2 quote, quote being one field. any ideas how to make csv.reader work correctly for the first case? the problem is the comma inside the quote inside the brackets, ie: [,] -- http://mail.python.org/mailman/listinfo/python-list
Re: csv.reader has trouble with comma inside quotes inside brackets
Thanks John, I didn't realize that the quotes were supposed to surround the entire field. I ended up making a quick script to replace comma's outside quotes with tabs. I was just trying to clean this crazy csv file to import into msyql. thanks again, bret -- http://mail.python.org/mailman/listinfo/python-list
Re: What do you think of ShowMeDo
2009/4/29 David Robinow drobi...@gmail.com On Wed, Apr 29, 2009 at 9:29 AM, ky...@showmedo.com wrote: ... To reiterate, I responded to this thread because I think Ben's posting gave an unfair impression of the site and i felt the need to address some misconceptions. I am sorry you failed to find the videos, but many tens of thousands are found every week and I really haven't heard of anyone failing to find their way to the content. In this sense I think you are exceptional. Count me as one who couldn't find his way. I'm not usually very sympathetic to whining about Gui's that aren't perfect, but this one is beyond my ability to traverse. I'd really like to view some of the content. I have no concern about the licensing; I have no intent to redistribute. Why do you make it so difficult? How about an ftp site with a directory of videos? That I could understand. Not sure why navigation has been a problem, I was able to follow it. A bit too many choices to get to the same place in round about ways, but I was able to navigate it. This thread has piqued my interest, so having done no real GUI programming in Python, I am going to try out Kyran's wxPython tutorial. -- - Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: Queries
2009/2/26 Steve Holden st...@holdenweb.com Murray wrote: [top-posting corrected] -Original Message- From: Gary Herron [mailto:gher...@islandtraining.com] Sent: Thursday, February 26, 2009 1:46 AM To: mmcclaf; python-list@python.org Subject: Re: Queries mmcclaf wrote: I have to make some queries for 4 tables I have. The following relations are: Classes(class, type, country, numGuns, bore, displacement) Ships (name, class, launched) Battles (name, date) Outcomes (ship, battle, result) The three queries I'm stuck on are the following: 1. Find the classes that have only one ship as a member of that class (not all ships are listed in the Ship table) Investigate a GROUP BY solution that selects groups having a count of 1. DISTINCT may be a simpler solution. 2. Find the countries that had both battleships and battlecruisers (those fall under type in Classes) Look at EXISTS for one possible solutions. 3. Find those ships that lived to fight another day; they were damaged in one battle, but later fought in another. From your model description I don't even see where the position and attitude of each ship is stored, so I don't think I can give you any help at all with this one. The best way for me to understand would be relational algebra for each of the statements. Sounds like a homework assignment.Good luck with it. It is, however I was able to get the first 8 done, I am struggling with these 3 particular ones. I have to make an SQL file based off of it, so this seems to be a blockage in my works. Good luck with the homework. Remember to acknowledge the help you've had from this list (particularly your earlier issues: here you just have hints). regards Steve -- Steve Holden+1 571 484 6266 +1 800 494 3119 Holden Web LLC http://www.holdenweb.com/ -- http://mail.python.org/mailman/listinfo/python-list -- - Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: Run a python script as an exe and run a new process from it
2009/2/26 venutaurus...@gmail.com venutaurus...@gmail.com On Feb 26, 7:00 pm, venutaurus...@gmail.com venutaurus...@gmail.com wrote: On Feb 26, 6:10 pm, Tim Wintle tim.win...@teamrubber.com wrote: On Thu, 2009-02-26 at 04:55 -0800, venutaurus...@gmail.com wrote: Hello all, I've a strange requirement where I need to run a python script just as we run an exe (by double clicking through windows explorer or by typing the script name at command prompt). I don't know how windows deals with this part In that process I should be able to execute another python script in such a way that, the second script should continue running but the main one should terminate without effecting the second one. standard daemon behavior I'd have thought This shows how you would do it (with lots of comments). Assume this should work on Windows. http://code.activestate.com/recipes/278731/ note the two child threads to prevent zombies - may not be needed on windows but good to use them anyway. Thanks for the reply, Being a newbie to python, I am finding it difficult to understand the logic even after thorough reading of comments. Is there any simpler way where I can just run a python script from the main script and exit without disturbing the second one(This will end based on some other constraints which can be handled). Or can some one throw some light on where should I run the function os.system( python script2.py) from the main one. Thank you, venu Adding to the above.. I've to do it in Windows platform and what I can see from the illustration (/dev/null) etc. they are for Unix Environment. For making a script executable try this link http://www.python.org/doc/faq/windows/#how-do-i-make-python-scripts-executable -- - Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: pysqlite smart search
2009/2/23 klia alwaseem307s...@yahoo.com klia wrote: Hey guys; I am trying to develop a tiny program using python to search inside sqlite database with file extension is .db in which the program will ask users to enter their search query and base on that it will retrieve the results But I need the program to have some smartness in search mechanism in which the program will guess that the user is looking for these key words in the database. so far i came up with this but the search ain't smart, i have to write the full key word in order to retrieve specific information. from pysqlite2 import dbapi2 as sqlite3 connection = sqlite3.connect('Photos.db') memoryConnection = sqlite3.connect(':memory:') cursor = connection.cursor() prompt = 'Enter your search query?\n' keyword = raw_input(prompt) if cursor.execute('SELECT * FROM photos WHERE Tag LIKE ?',[keyword]): print cursor.fetchall() else: cursor.execute('SELECT * FROM photos WHERE Date LIKE ?', [keyword]) print cursor.fetchall() Any ideas and thanks in advance Reply thank you man, it worked perfectly but one more thing; when i print rows it retrieves the whole rows of info which i don't need, i need just to retrieve the name of the photo. so how am i gonna do that? It depends on the structure of your table, but you're going to have to change the following lines: if cursor.execute('SELECT * FROM photos WHERE Tag LIKE ?',[keyword]): cursor.execute('SELECT * FROM photos WHERE Date LIKE ?', [keyword]) * indicates all fields in the selected records, so you need to change the * to the field that contains the name of the photo. For example: if cursor.execute('SELECT name FROM photos WHERE Tag LIKE ?',[keyword]): -- View this message in context: http://www.nabble.com/pysqlite-smart-search-tp22157116p22161119.html Sent from the Python - python-list mailing list archive at Nabble.com. -- http://mail.python.org/mailman/listinfo/python-list -- - Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: A global or module-level variable?
On Jan 23, 2:27 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: En Wed, 23 Jan 2008 11:58:05 -0200, Bret [EMAIL PROTECTED] escribió: On Jan 22, 1:00 pm, Paul Rubin http://[EMAIL PROTECTED] wrote: If you have to do it that way, use: Is there a better way? A more Pythonic way? It's simple, clear and works fine, why make it more complicated? Unless you have additional requirements, like a multithreaded program. -- Gabriel Genellina Ultimately, it will be multithreaded -- and I had intended to wrap the access to the global member in a lock to ensure only one thread could get a value at any point. It might also become multiprocess (ugh!) and so might need to live in its own SocketServer some day. But for now, I agree. Simple is good. I just wanted to be sure I wasn't oversimplifying, you know? Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Re: A global or module-level variable?
On Jan 22, 1:00 pm, Paul Rubin http://[EMAIL PROTECTED] wrote: If you have to do it that way, use: Is there a better way? A more Pythonic way? -- http://mail.python.org/mailman/listinfo/python-list
A global or module-level variable?
This has to be easier than I'm making it I've got a module, remote.py, which contains a number of classes, all of whom open a port for communication. I'd like to have a way to coordinate these port numbers akin to this: So I have this in the __init__.py file for a package called cstore: nextport=42000 def getNextPort(): nextport += 1 return nextport : Then, in the class where I wish to use this (in cstore.remote.py): : class Spam(): def __init__(self, **kwargs): self._port = cstore.getNextPort() I can't seem to make this work, though. As given here, I get an UnboundLocalError:local variable 'nextport' referenced before assignment. When I try prefixing the names inside __init__.py with cstore., I get an error that the global name cstore is not defined. I've been looking at this long enough that my eyes are blurring. Any ideas? BTW, the driving force here is that I'm going to need to wrap this in some thread synchronization. For now, though, I'm just trying to get the basics working. Thanks! Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: Source formatting fixer?
The thing is, I'm not so much trying to fix indentation issues as spacing problems that affect readability but not program structure. All the indentation is fine, this is more trying to change things like: if ((one==two)and(three==four)): a=b+42 c=Classname (a,b) print Class %s created%c.__name__ None of the above is wrong, it's just painfully ugly and given Python's natural beauty, it seems really wrong all the same Bret On Dec 11, 3:26 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: Python already comes with a reindenter, see Tools\scripts\reindent.py If you want to transform y= f ( x- 3 ) into y = f(x - 3) try PythonTidy (search this same group for a link) -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list
Re: SimpleXMLRPCServer interruptable?
On Dec 6, 7:43 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: En Thu, 06 Dec 2007 13:11:09 -0300, Bret [EMAIL PROTECTED] escribió: For completeness, what I ended up doing is this: server = SimpleXMLRPCServer((host, port)) server.socket.settimeout(0.1) ServerWrapper became: def ServerWrapper(): while True: try: server.handle_request() if self.done.isSet(): break except timeout: pass And that seems to do the trick! Giving the socket a timeout allows me to check the Event more frequently and catch the change within a reasonable time. Remember that the timeout applies to *all* socket operations; what if the XML request requires more than 0.1s to read? If handling large requests is more important than the delay at shutdown time, consider raising that value. -- Gabriel Genellina Good point. Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Source formatting fixer?
Does anyone know of a package that can be used to fix bad formatting in Python code? I don't mean actual errors, just instances where someone did things that violate the style guide and render the code harder to read. If nothing exists, I'll start working on some sed scripts or something to add spaces back in but I'm hoping someone out there has already done something like this. Thanks! Bret Wortman -- http://mail.python.org/mailman/listinfo/python-list
Re: SimpleXMLRPCServer interruptable?
On Dec 5, 10:00 pm, Edward Kozlowski [EMAIL PROTECTED] wrote: On Dec 5, 10:19 pm, Edward Kozlowski [EMAIL PROTECTED] wrote: On Dec 5, 6:22 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: En Wed, 05 Dec 2007 18:20:35 -0300, Bret [EMAIL PROTECTED] escribió: I just tried changing this so that I now have a threading.Event() called self.done, which is set within the body of the shutdown() method. The serverWrapper loop now looks like this: def serverWrapper(): while True: server.handle_request() if self.done.isSet(): break This works, but only if I follow the shutdown() rpc call a few seconds later with ... something else to cause handle_request() to complete again. Obviously, not quite the right approach You could try setting a reasonable timeout on the listening socket; I would override the server_bind method, calling self.socket.settimeout(xxx) before calling the inherited method. I've never actually done it with a SimpleXMLRPCServer, but *should* work. Don't use a very small timeout, because it affects *all* subsequent operations. -- Gabriel Genellina Try this: def __init__(self, host, port): self.done = False server = SimpleXMLRPCServer((host, port)) : : Bunch of server.register_function calls : def serverWrapper(): try: while not self.done: server.handle_request() except: pass Your shutdown method becomes: def shutdown(self): self.done = True HTH -Edward Kozlowski Sorry about the first post, I shot from the hip and had to make a few more modifications to make it 'working' code. The example below works fine for me. import SimpleXMLRPCServer class myServer: def __init__(self, host, port): self.done = False self.server = SimpleXMLRPCServer.SimpleXMLRPCServer((host, port)) def shutdown(self): self.done = True return 0 def getName(self): return Hey, I'm Ed def serverWrapper(self): self.server.register_function(self.getName) self.server.register_function(self.shutdown) try: while not self.done: self.server.handle_request() except: pass if __name__ == __main__: myServer('localhost', 6058).serverWrapper() s.getName() Hey, I'm Ed s.shutdown() 0 Thanks to all! I'm now keeping a file of my own snippets in hardcopy so I won't lose them next time I change jobs. :-) Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: SimpleXMLRPCServer interruptable?
On Dec 6, 7:04 am, Bret [EMAIL PROTECTED] wrote: On Dec 5, 10:00 pm, Edward Kozlowski [EMAIL PROTECTED] wrote: On Dec 5, 10:19 pm, Edward Kozlowski [EMAIL PROTECTED] wrote: On Dec 5, 6:22 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: En Wed, 05 Dec 2007 18:20:35 -0300, Bret [EMAIL PROTECTED] escribió: I just tried changing this so that I now have a threading.Event() called self.done, which is set within the body of the shutdown() method. The serverWrapper loop now looks like this: def serverWrapper(): while True: server.handle_request() if self.done.isSet(): break This works, but only if I follow the shutdown() rpc call a few seconds later with ... something else to cause handle_request() to complete again. Obviously, not quite the right approach You could try setting a reasonable timeout on the listening socket; I would override the server_bind method, calling self.socket.settimeout(xxx) before calling the inherited method. I've never actually done it with a SimpleXMLRPCServer, but *should* work. Don't use a very small timeout, because it affects *all* subsequent operations. -- Gabriel Genellina Try this: def __init__(self, host, port): self.done = False server = SimpleXMLRPCServer((host, port)) : : Bunch of server.register_function calls : def serverWrapper(): try: while not self.done: server.handle_request() except: pass Your shutdown method becomes: def shutdown(self): self.done = True HTH -Edward Kozlowski Sorry about the first post, I shot from the hip and had to make a few more modifications to make it 'working' code. The example below works fine for me. import SimpleXMLRPCServer class myServer: def __init__(self, host, port): self.done = False self.server = SimpleXMLRPCServer.SimpleXMLRPCServer((host, port)) def shutdown(self): self.done = True return 0 def getName(self): return Hey, I'm Ed def serverWrapper(self): self.server.register_function(self.getName) self.server.register_function(self.shutdown) try: while not self.done: self.server.handle_request() except: pass if __name__ == __main__: myServer('localhost', 6058).serverWrapper() s.getName() Hey, I'm Ed s.shutdown() 0 Thanks to all! I'm now keeping a file of my own snippets in hardcopy so I won't lose them next time I change jobs. :-) Bret Oops, this actually misses part of the problem -- I need to construct this server programmatically, so imbedding the call to start the server in the if __name__ construct doesn't work. If I start it within the __init__, then the object that's creating it gets stuck waiting for it to finish, which it never will. I need this to be autonomous, which is why I was trying to do the start of the server in a separate thread, but that doesn't seem to work either (that's what's causing my process to need the second call; the thread completes the loop and enters the next handle_request() call before the event or boolean gets set). Basically, I need a way for one server to start other autonomous servers without waiting on them, and still retain the ability to shut them down when their work is done. Back to the keyboard. ;-) Bret -- http://mail.python.org/mailman/listinfo/python-list
Re: SimpleXMLRPCServer interruptable?
On Dec 6, 7:04 am, Bret [EMAIL PROTECTED] wrote: On Dec 5, 10:00 pm, Edward Kozlowski [EMAIL PROTECTED] wrote: On Dec 5, 10:19 pm, Edward Kozlowski [EMAIL PROTECTED] wrote: On Dec 5, 6:22 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: En Wed, 05 Dec 2007 18:20:35 -0300, Bret [EMAIL PROTECTED] escribió: I just tried changing this so that I now have a threading.Event() called self.done, which is set within the body of the shutdown() method. The serverWrapper loop now looks like this: def serverWrapper(): while True: server.handle_request() if self.done.isSet(): break This works, but only if I follow the shutdown() rpc call a few seconds later with ... something else to cause handle_request() to complete again. Obviously, not quite the right approach You could try setting a reasonable timeout on the listening socket; I would override the server_bind method, calling self.socket.settimeout(xxx) before calling the inherited method. I've never actually done it with a SimpleXMLRPCServer, but *should* work. Don't use a very small timeout, because it affects *all* subsequent operations. -- Gabriel Genellina Try this: def __init__(self, host, port): self.done = False server = SimpleXMLRPCServer((host, port)) : : Bunch of server.register_function calls : def serverWrapper(): try: while not self.done: server.handle_request() except: pass Your shutdown method becomes: def shutdown(self): self.done = True HTH -Edward Kozlowski Sorry about the first post, I shot from the hip and had to make a few more modifications to make it 'working' code. The example below works fine for me. import SimpleXMLRPCServer class myServer: def __init__(self, host, port): self.done = False self.server = SimpleXMLRPCServer.SimpleXMLRPCServer((host, port)) def shutdown(self): self.done = True return 0 def getName(self): return Hey, I'm Ed def serverWrapper(self): self.server.register_function(self.getName) self.server.register_function(self.shutdown) try: while not self.done: self.server.handle_request() except: pass if __name__ == __main__: myServer('localhost', 6058).serverWrapper() s.getName() Hey, I'm Ed s.shutdown() 0 Thanks to all! I'm now keeping a file of my own snippets in hardcopy so I won't lose them next time I change jobs. :-) Bret For completeness, what I ended up doing is this: server = SimpleXMLRPCServer((host, port)) server.socket.settimeout(0.1) ServerWrapper became: def ServerWrapper(): while True: try: server.handle_request() if self.done.isSet(): break except timeout: pass And that seems to do the trick! Giving the socket a timeout allows me to check the Event more frequently and catch the change within a reasonable time. Thanks again, Ed and Gabriel. Bret -- http://mail.python.org/mailman/listinfo/python-list
SimpleXMLRPCServer interruptable?
I'm coming back to Python after an absence and it's surprising how many things I've forgotten since wandering (against my will) into Java land. Anyway, I have a need for a way to make SimpleXMLRPCServer interruptable. Basically, I have a main server that, in response to certain RPC calls, creates additional servers on different ports. I then need to be able to shut these additional servers down. I've got something like this in the __init__ of the class which contains the spawned servers: def __init__(self, host, port): : : server = SimpleXMLRPCServer((host, port)) : : Bunch of server.register_function calls : def serverWrapper(): try: while True: server.handle_request() except: pass One of the methods that I register is: def shutdown(self): raise Quitting time Through watching logs and such I can see that the shutdown() method is getting called, but the loop isn't getting broken. I've done something like this before in a previous job (so I don't have my source in front of me, more's the pity) and am hoping someone can chime in with a good idea. Thanks in advance! Bret Wortman -- http://mail.python.org/mailman/listinfo/python-list
Re: SimpleXMLRPCServer interruptable?
I just tried changing this so that I now have a threading.Event() called self.done, which is set within the body of the shutdown() method. The serverWrapper loop now looks like this: def serverWrapper(): while True: server.handle_request() if self.done.isSet(): break This works, but only if I follow the shutdown() rpc call a few seconds later with ... something else to cause handle_request() to complete again. Obviously, not quite the right approach On Dec 5, 2:00 pm, Bret [EMAIL PROTECTED] wrote: I'm coming back to Python after an absence and it's surprising how many things I've forgotten since wandering (against my will) into Java land. Anyway, I have a need for a way to make SimpleXMLRPCServer interruptable. Basically, I have a main server that, in response to certain RPC calls, creates additional servers on different ports. I then need to be able to shut these additional servers down. I've got something like this in the __init__ of the class which contains the spawned servers: def __init__(self, host, port): : : server = SimpleXMLRPCServer((host, port)) : : Bunch of server.register_function calls : def serverWrapper(): try: while True: server.handle_request() except: pass One of the methods that I register is: def shutdown(self): raise Quitting time Through watching logs and such I can see that the shutdown() method is getting called, but the loop isn't getting broken. I've done something like this before in a previous job (so I don't have my source in front of me, more's the pity) and am hoping someone can chime in with a good idea. Thanks in advance! Bret Wortman -- http://mail.python.org/mailman/listinfo/python-list