Subject: FAQ: Python -- an object-oriented language Newsgroups: comp.lang.python,comp.answers,news.answers Followup-to: comp.lang.python From: guido@cnri.reston.va.us (Guido van Rossum) Reply-to: guido@cnri.reston.va.us (Guido van Rossum) Expires: Sun, 1 Dec 1996 00:00:00 GMT Supersedes: Approved: news-answers-request@MIT.Edu Archive-name: python-faq/part1 Submitted-by: Guido van Rossum Version: $Revision$ Last-modified: $Date$ This article contains answers to Frequently Asked Questions about Python (an object-oriented interpreted programming language -- see the answer to question 1.1 for a short overview). Copyright 1993-1996 Guido van Rossum. Unchanged electronic redistribution of this FAQ is allowed. Printed redistribution only with permission of the author. No warranties. Author's address: Guido van Rossum C.N.R.I. 1895 Preston White Drive Reston, VA 20191 U.S.A. Email: , The latest version of this FAQ is available by anonymous ftp from . It will also be posted regularly to the newsgroups comp.answers and comp.lang.python . Many FAQs, including this one, are available by anonymous ftp . The name under which a FAQ is archived appears in the Archive-name line at the top of the article. This FAQ is archived as python-faq/part1 . There's a mail server on that machine which will send you files from the archive by e-mail if you have no ftp access. You send a e-mail message to containing the single word help in the message body to receive instructions. This FAQ is divided in the following chapters: 1. General information and availability 2. Python in the real world 3. Building Python and Other Known Bugs 4. Programming in Python 5. Extending Python 6. Python's design 7. Using Python on non-UNIX platforms To find the start of a particular chapter, search for the chapter number followed by a dot and a space at the beginning of a line (e.g. to find chapter 4 in vi, type /^4\. /). Here's an overview of the questions per chapter: 1. General information and availability 1.1. Q. What is Python? 1.2. Q. Why is it called Python? 1.3. Q. How do I obtain a copy of the Python source? 1.4. Q. How do I get documentation on Python? 1.5. Q. Are there other ftp sites that mirror the Python distribution? 1.6. Q. Is there a newsgroup or mailing list devoted to Python? 1.7. Q. Is there a WWW page devoted to Python? 1.8. Q. Is the Python documentation available on the WWW? 1.9. Q. Is there a book on Python, or will there be one out soon? 1.10. Q. Are there any published articles about Python that I can quote? 1.11. Q. Are there short introductory papers or talks on Python? 1.12. Q. How does the Python version numbering scheme work? 1.13. Q. How do I get a beta test version of Python? 1.14. Q. Are there copyright restrictions on the use of Python? 1.15. Q. Why was Python created in the first place? 2. Python in the real world 2.1. Q. How many people are using Python? 2.2. Q. Have any significant projects been done in Python? 2.3. Q. Are there any commercial projects going on using Python? 2.4. Q. How stable is Python? 2.5. Q. What new developments are expected for Python in the future? 2.6. Q. Is it reasonable to propose incompatible changes to Python? 2.7. Q. What is the future of Python? 2.8. Q. What is the PSA, anyway? 2.9. Q. How do I join the PSA? 2.10. Q. What are the benefits of joining the PSA? 3. Building Python and Other Known Bugs 3.1. Q. Is there a test set? 3.2. Q. When running the test set, I get complaints about floating point operations, but when playing with floating point operations I cannot find anything wrong with them. 3.3. Q. Link errors after rerunning the configure script. 3.4. Q. The python interpreter complains about options passed to a script (after the script name). 3.5. Q. When building on the SGI, make tries to run python to create glmodule.c, but python hasn't been built or installed yet. 3.6. Q. I use VPATH but some targets are built in the source directory. 3.7. Q. Trouble building or linking with the GNU readline library. 3.8. Q. Trouble with socket I/O on older Linux 1.x versions. 3.9. Q. Trouble with prototypes on Ultrix. 3.10. Q. Other trouble building Python on platform X. 3.11. Q. How to configure dynamic loading on Linux. 3.12. Q: I can't get shared modules to work on Linux 2.0 (Slackware96)? 3.13. Q: Trouble when making modules shared on Linux. 3.14. Q. How to use threads on Linux. 3.15. Q. Errors when linking with a shared library containing C++ code. 3.16. Q. I built with tkintermodule.c enabled but get "Tkinter not found". 3.17. Q. I built with Tk 4.0 but Tkinter complains about the Tk version. 3.18. Q. Link errors for Tcl/Tk symbols when linking with Tcl/Tk. 3.19. Q. I configured and built Python for Tcl/Tk but "import Tkinter" fails. 3.20. Q. Tk doesn't work right on DEC Alpha. 3.21. Q. Several common system calls are missing from the posix module. 3.22. Q. ImportError: No module named string, on MS Windows. 3.23. Q. Core dump on SGI when using the gl module. 4. Programming in Python 4.1. Q. Is there a source code level debugger with breakpoints, step, etc.? 4.2. Q. Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)? (Also phrased as: Can I use a built-in type as base class?) 4.3. Q. Is there a curses/termcap package for Python? 4.4. Q. Is there an equivalent to C's onexit() in Python? 4.5. Q. When I define a function nested inside another function, the nested function seemingly can't access the local variables of the outer function. What is going on? How do I pass local data to a nested function? 4.6. Q. How do I iterate over a sequence in reverse order? 4.7. Q. My program is too slow. How do I speed it up? 4.8. Q. When I have imported a module, then edit it, and import it again (into the same Python process), the changes don't seem to take place. What is going on? 4.9. Q. How do I find the current module name? 4.10. Q. I have a module in which I want to execute some extra code when it is run as a script. How do I find out whether I am running as a script? 4.11. Q. I try to run a program from the Demo directory but it fails with ImportError: No module named ...; what gives? 4.12. Q. I have successfully built Python with STDWIN but it can't find some modules (e.g. stdwinevents). 4.13. Q. What GUI toolkits exist for Python? 4.14. Q. Are there any interfaces to database packages in Python? 4.15. Q. Is it possible to write obfuscated one-liners in Python? 4.16. Q. Is there an equivalent of C's "?:" ternary operator? 4.17. Q. My class defines __del__ but it is not called when I delete the object. 4.18. Q. How do I change the shell environment for programs called using os.popen() or os.system()? Changing os.environ doesn't work. 4.19. Q. What is a class? 4.20. Q. What is a method? 4.21. Q. What is self? 4.22. Q. What is a unbound method? 4.23. Q. How do I call a method defined in a base class from a derived class that overrides it? 4.24. Q. How do I call a method from a base class without using the name of the base class? 4.25. Q. How can I organize my code to make it easier to change the base class? 4.26. Q. How can I find the methods or attributes of an object? 4.27. Q. I can't seem to use os.read() on a pipe created with os.popen(). 4.28. Q. How can I create a stand-alone binary from a Python script? 4.29. Q. What WWW tools are there for Python? 4.30. Q. How do I run a subprocess with pipes connected to both input and output? 4.31. Q. How do I call a function if I have the arguments in a tuple? 4.32. Q. How do I enable font-lock-mode for Python in Emacs? 4.33. Q. Is there an inverse to the format operator (a la C's scanf())? 4.34. Q. Can I have Tk events handled while waiting for I/O? 4.35. Q. How do I write a function with output parameters (call by reference)? 4.36. Q. Please explain the rules for local and global variables in Python. 4.37. Q. How can I have modules that mutually import each other? 4.38. Q. How do I copy an object in Python? 4.39. Q. How to implement persistent objects in Python? (Persistent == automatically saved to and restored from disk.) 4.40. Q. I try to use __spam and I get an error about _SomeClassName__spam. 4.41. Q. How do I delete a file? And other file questions. 4.42. Q. How to modify urllib or httplib to support HTTP/1.1? 4.43. Q. Unexplicable syntax errors in compile() or exec. 4.44. Q. How do I convert a string to a number? 4.45. Q. How do I convert a number to a string? 5. Extending Python 5.1. Q. Can I create my own functions in C? 5.2. Q. Can I create my own functions in C++? 5.3. Q. How can I execute arbitrary Python statements from C? 5.4. Q. How can I evaluate an arbitrary Python expression from C? 5.5. Q. How do I extract C values from a Python object? 5.6. Q. How do I use mkvalue() to create a tuple of arbitrary length? 5.7. Q. How do I call an object's method from C? 5.8. Q. How do I catch the output from print_error()? 5.9. Q. How do I access a module written in Python from C? 5.10. Q. How do I interface to C++ objects from Python? 6. Python's design 6.1. Q. Why isn't there a switch or case statement in Python? 6.2. Q. Why does Python use indentation for grouping of statements? 6.3. Q. Why are Python strings immutable? 6.4. Q. Why don't strings have methods like index() or sort(), like lists? 6.5. Q. Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))? 6.6. Q. Why can't I derive a class from built-in types (e.g. lists or files)? 6.7. Q. Why must 'self' be declared and used explicitly in method definitions and calls? 6.8. Q. Can't you emulate threads in the interpreter instead of relying on an OS-specific thread implementation? 6.9. Q. Why can't lambda forms contain statements? 6.10. Q. Why don't lambdas have access to variables defined in the containing scope? 6.11. Q. Why can't recursive functions be defined inside other functions? 6.12. Q. Why is there no more efficient way of iterating over a dictionary than first constructing the list of keys()? 6.13. Q. Can Python be compiled to machine code, C or some other language? 6.14. Q. Why doesn't Python use proper garbage collection? 7. Using Python on non-UNIX platforms 7.1. Q. Is there a Mac version of Python? 7.2. Q. Are there DOS and Windows versions of Python? 7.3. Q. Is there an OS/2 version of Python? 7.4. Q. Is there a VMS version of Python? 7.5. Q. What about IBM mainframes, or other non-UNIX platforms? 7.6. Q. Where are the source or Makefiles for the non-UNIX versions? 7.7. Q. What is the status and support for the non-UNIX versions? 7.8. Q. I have a PC version but it appears to be only a binary. Where's the library? 7.9. Q. Where's the documentation for the Mac or PC version? 7.10. Q. The Mac (PC) version doesn't seem to have any facilities for creating or editing programs apart from entering it interactively, and there seems to be no way to save code that was entered interactively. How do I create a Python program on the Mac (PC)? To find a particular question, search for the question number followed by a dot, a space, and a Q at the beginning of a line (e.g. to find question 4.2 in vi, type /^4\.2\. Q/). 1. General information and availability ======================================= 1.1. Q. What is Python? A. Python is an interpreted, interactive, object-oriented programming language. It incorporates modules, exceptions, dynamic typing, very high level dynamic data types, and classes. Python combines remarkable power with very clear syntax. It has interfaces to many system calls and libraries, as well as to various window systems, and is extensible in C or C++. It is also usable as an extension language for applications that need a programmable interface. Finally, Python is portable: it runs on many brands of UNIX, on the Mac, and on PCs under MS-DOS, Windows, Windows NT, and OS/2. To find out more, the best thing to do is to start reading the tutorial from the documentation set (see a few questions further down). 1.2. Q. Why is it called Python? A. Apart from being a computer scientist, I'm also a fan of "Monty Python's Flying Circus" (a BBC comedy series from the seventies, in the -- unlikely -- case you didn't know). It occurred to me one day that I needed a name that was short, unique, and slightly mysterious. And I happened to be reading some scripts from the series at the time... So then I decided to call my language Python. But Python is not a joke. And don't you associate it with dangerous reptiles either! (If you need an icon, use an image of the 16-ton weight from the TV series or of a can of SPAM :-) 1.3. Q. How do I obtain a copy of the Python source? A. The latest complete Python source distribution is always available by anonymous ftp, e.g. . It is a gzipped tar file containing the complete C source, LaTeX documentation, Python library modules, example programs, and several useful pieces of freely distributable software. This will compile and run out of the box on most UNIX platforms. (See section 7 for non-UNIX information.) Sometimes beta versions of a newer release are available; check the subdirectory "beta" of the above-mentioned URL (i.e. ). (At the time of writing, beta3 for Python 1.4 is available there, and should be checked before reporting problems with version 1.3.) Occasionally a set of patches is issued which has to be applied using the patch program. These patches are placed in the same directory, e.g. . (At the time of writing, no patches exist.) An index of said ftp directory can be found in the file INDEX. An HTML version of the index can be found in the file index.html, . 1.4. Q. How do I get documentation on Python? A. The LaTeX source for the documentation is part of the source distribution. If you don't have LaTeX, the latest Python documentation set is always available by anonymous ftp, e.g. . It is a gzipped tar file containing PostScript files of the reference manual, the library manual, and the tutorial. Note that the library manual is the most important one of the set, as much of Python's power stems from the standard or built-in types, functions and modules, all of which are described here. PostScript for a high-level description of Python is in the file nluug-paper.ps (a separate file on the ftp site). 1.5. Q. Are there other ftp sites that mirror the Python distribution? A. The following anonymous ftp sites keep mirrors of the Python distribution: USA: Europe: Australia: Or try archie on the string "python". 1.6. Q. Is there a newsgroup or mailing list devoted to Python? A. There is a newsgroup, comp.lang.python , and a mailing list. The newsgroup and mailing list are gatewayed into each other -- if you can read news it's unnecessary to subscribe to the mailing list. Send e-mail to to (un)subscribe to the mailing list. Hypermail archives of (nearly) everything posted to the mailing list (and thus the newsgroup) are available on our WWW server, . The raw archives are also available by ftp, e.g. . The uncompressed versions of these files can be read with the standard UNIX Mail program ("Mail -f file") or with nn ("nn file"). To read them using MH, you could use "inc -file file". (The archival service has stopped archiving new articles around the end of April 1995. I hope to revive it on the PSA server www.python.org sometime in the future.) 1.7. Q. Is there a WWW page devoted to Python? A. Yes, is the official Python home page. At the time of writing, this page is not yet completely operational; you may have a look at the old Python home page: or at the U.S. copy: . 1.8. Q. Is the Python documentation available on the WWW? A. Yes, see (Python's home page). It contains pointers to hypertext versions of the whole documentation set (as hypertext, not just PostScript). If you wish to browse this collection of HTML files on your own machine, it is available bundled up by anonymous ftp, e.g. . An Emacs-INFO set containing the library manual is also available by ftp, e.g. . 1.9. Q. Is there a book on Python, or will there be one out soon? A. Mark Lutz is writing a Python book for O'Reilly and Associates, to be published early 1996. See the outline (in PostScript): . 1.10. Q. Are there any published articles about Python that I can quote? A. So far the only refereed and published article that describes Python in some detail is: Guido van Rossum and Jelke de Boer, "Interactively Testing Remote Servers Using the Python Programming Language", CWI Quarterly, Volume 4, Issue 4 (December 1991), Amsterdam, pp 283-303. LaTeX source for this paper is available as part of the Python source distribution. See also the next section (supposedly Aaron Watters' paper has been refereed). 1.11. Q. Are there short introductory papers or talks on Python? A. A recent, very entertaining introduction to Python is the tutorial by Aaron Watters in UnixWorld Online: Aaron R. Watters: "The What, Why, Who, and Where of Python", An olded paper is: Guido van Rossum, "An Introduction to Python for UNIX/C Programmers", in the proceedings of the NLUUG najaarsconferentie 1993 (dutch UNIX users group meeting November 1993). PostScript for this paper and for the slides used for the accompanying presentation is available by ftp as and , respectively. Slides for a talk on Python that I gave at the Usenix Symposium on Very High Level Languages in Santa Fe, NM, USA in October 1994 are available as . 1.12. Q. How does the Python version numbering scheme work? A. Python versions are numbered A.B.C or A.B. A is the major version number -- it is only incremented for major changes in functionality or source structure. B is the minor version number, incremented for less earth-shattering changes to a release. C is the patchlevel -- it is incremented for each new patch release. Not all releases have patch releases. Note that in the past, patches have added significant changes; in fact the changeover from 0.9.9 to 1.0.0 was the first time that either A or B changed! Beta versions have an additional suffix of "betaN" for some small number N. Note that (for instance) all versions labeled 1.4betaN *precede* the actual release of 1.4. 1.4b3 is short for 1.4beta3. 1.13. Q. How do I get a beta test version of Python? A. If there are any beta releases, they are published in the normal source directory (e.g. ). 1.14. Q. Are there copyright restrictions on the use of Python? A. Hardly. You can do anything you want with the source, as long as you leave the copyrights in, and display those copyrights in any documentation about Python that you produce. Also, don't use the author's institute's name in publicity without prior written permission, and don't hold them responsible for anything (read the actual copyright for a precise legal wording). In particular, if you honor the copyright rules, it's OK to use Python for commercial use, to sell copies of Python in source or binary form, or to sell products that enhance Python or incorporate Python (or part of it) in some form. I would still like to know about all commercial use of Python! 1.15. Q. Why was Python created in the first place? A. Here's a *very* brief summary of what got me started: - I had extensive experience with implementing an interpreted language in the ABC group at CWI, and from working with this group I had learned a lot about language design. This is the origin of many Python features, including the use of indentation for statement grouping and the inclusion of very-high-level data types (although the details are all different in Python). - I had a number of gripes about the ABC language, but also liked many of its features. It was impossible to extend the ABC language (or its implementation) to remedy my complaints -- in fact its lack of extensibility was one of its biggest problems. - I had some experience with using Modula-2+ and talked with the designers of Modula-3 (and read the M3 report). M3 is the origin of the syntax and semantics used for exceptions, and some other Python features. - I was working in the Amoeba distributed operating system group at CWI. We needed a better way to do system administration than by writing either C programs or Bourne shell scripts, since Amoeba had its own system call interface which wasn't easily accessible from the Bourne shell. My experience with error handling in Amoeba made me acutely aware of the importance of exceptions as a programming language feature. - It occurred to me that a scripting language with a syntax like ABC but with access to the Amoeba system calls would fill the need. I realized that it would be foolish to write an Amoeba-specific language, so I decided that I needed a language that was generally extensible. - During the 1989 Christmas holidays, I had a lot of time on my hand, so I decided to give it a try. During the next year, while still mostly working on it in my own time, Python was used in the Amoeba project with increasing success, and the feedback from colleagues made me add many early improvements. - In February 1991, after just over a year of development, I decided to post to USENET. The rest is in the Misc/HISTORY file. 2. Python in the real world =========================== 2.1. Q. How many people are using Python? A. I don't know, but the maximum number of simultaneous subscriptions to the Python mailing list before it was gatewayed into the newsgroup was about 180 (several of which were local redistribution lists). I believe that many active Python users don't bother to subscribe to the list, and now that there's a newsgroup the mailing list subscription is even less meaningful. I see new names on the newsgroup all the time and my best guess is that there are currently at least several thousands of users. Another statistic is the number of accesses to the Python WWW server. Have a look at . 2.2. Q. Have any significant projects been done in Python? A. Here at CWI (the home of Python), we have written a 20,000 line authoring environment for transportable hypermedia presentations, a 5,000 line multimedia teleconferencing tool, as well as many many smaller programs. The University of Virginia uses Python to control a virtual reality engine. Contact: Matt Conway . The ILU project at Xerox PARC can generate Python glue for ILU interfaces. See . The University of California, Irvine uses a student administration system called TELE-Vision written entirely in Python. Contact: Ray Price . See also the next question. If you have done a significant project in Python that you'd like to be included in the list above, send me email! 2.3. Q. Are there any commercial projects going on using Python? A. Yes, there's lots of commercial activity using Python. See for a list. 2.4. Q. How stable is Python? A. Very stable. While the current version number would suggest it is in the early stages of development, in fact new, stable releases (numbered 0.9.x through 1.4) have been coming out roughly every 3 to 6 or 12 months for the past four years. 2.5. Q. What new developments are expected for Python in the future? A. Follow the newsgroup discussions! The workshop proceedings () may also contain interesting looks into the future. 2.6. Q. Is it reasonable to propose incompatible changes to Python? A. In general, no. There are already millions of lines of Python code around the world, so any changes in the language that invalidates more than a very small fraction of existing programs has to be frowned upon. Even if you can provide a conversion program, there still is the problem of updating all documentation. Providing a gradual upgrade path is the only way if a feature has to be changed. 2.7. Q. What is the future of Python? A. If I knew, I'd be rich :-) Seriously, the formation of the PSA (Pyton Software Activity, see ) ensures some kind of support even in the (unlikely! event that I'd be hit by a bus (actually, here in the US, a car accident would be more likely :-), were to join a nunnery, or would be head-hunted. A large number of Python users have become experts at Python programming as well as maintenance of the implementation, and would easily fill the vacuum created by my disappearance. In the mean time, I have no plans to disappear -- rather, I am committed to improving Python, and my current benefactor, CNRI (see ) is just as committed to continue its support of Python and the PSA. In fact, we have great plans for Python -- we just can't tell yet! 2.8. Q. What is the PSA, anyway? A. The Python Software Activity was created by a number of Python aficionados who want Python to be more than the product and responsibility of a single individual. It has found a home at CNRI . Anybody who wishes Python well should join the PSA. 2.9. Q. How do I join the PSA? A. The full scoop is available on the web, see . Summary: send a check of at least $50 to CNRI/PSA, 1895 Preston White Drive, Suite 100, in Reston, VA 20191. Full-time students pay $25. Companies can join for a mere $500. 2.10. Q. What are the benefits of joining the PSA? A. Like National Public Radio, if not enough people join, Python will wither. Your name will be mentioned on the PSA's web server. Workshops organized by the PSA are only accessible to PSA members (you can join at the door). The PSA is working on additional benefits, such as reduced prices for books and software, and early access to beta versions of Python. 3. Building Python and Other Known Bugs ======================================= 3.1. Q. Is there a test set? A. Yes, simply do "import testall" (or "import autotest" if you aren't interested in the output). The standard modules whose name begins with "test" together comprise the test. The test set doesn't test *all* features of Python but it goes a long way to confirm that a new port is actually working. The Makefile contains an entry "make test" which runs the autotest module. NOTE: if "make test" fails, run the tests manually ("import testall") to see what goes wrong before reporting the error. 3.2. Q. When running the test set, I get complaints about floating point operations, but when playing with floating point operations I cannot find anything wrong with them. A. The test set makes occasional unwarranted assumptions about the semantics of C floating point operations. Until someone donates a better floating point test set, you will have to comment out the offending floating point tests and execute similar tests manually. 3.3. Q. Link errors after rerunning the configure script. A. It is generally necessary to run "make clean" after a configuration change. 3.4. Q. The python interpreter complains about options passed to a script (after the script name). A. You are probably linking with GNU getopt, e.g. through -liberty. Don't. The reason for the complaint is that GNU getopt, unlike System V getopt and other getopt implementations, doesn't consider a non-option to be the end of the option list. A quick (and compatible) fix for scripts is to add "--" to the interpreter, like this: #! /usr/local/bin/python -- You can also use this interactively: python -- script.py [options] Note that a working getopt implementation is provided in the Python distribution (in Python/getopt.c) but not automatically used. 3.5. Q. When building on the SGI, make tries to run python to create glmodule.c, but python hasn't been built or installed yet. A. Comment out the line mentioning glmodule.c in Setup and build a python without gl first; install it or make sure it is in your $PATH, then edit the Setup file again to turn on the gl module, and make again. You don't need to do "make clean"; you do need to run "make Makefile" in the Modules subdirectory (or just run "make" at the toplevel). 3.6. Q. I use VPATH but some targets are built in the source directory. A. On some systems (e.g. Sun), if the target already exists in the source directory, it is created there instead of in the build directory. This is usually because you have previously built without VPATH. Try running "make clobber" in the source directory. 3.7. Q. Trouble building or linking with the GNU readline library. A. Consider using readline 2.0. Some hints: - You can use the GNU readline library to improve the interactive user interface: this gives you line editing and command history when calling python interactively. You need to configure and build the GNU readline library before running the configure script. Its sources are no longer distributed with Python; you can ftp them from any GNU mirror site, or from its home site (or a higher version number -- using version 1.x is not recommended). Pass the Python configure script the option --with-readline=DIRECTORY where DIRECTORY is the absolute pathname of the directory where you've built the readline library. Some hints on building and using the readline library: - On SGI IRIX 5, you may have to add the following to rldefs.h: #ifndef sigmask #define sigmask(sig) (1L << ((sig)-1)) #endif - On most systems, you will have to add #include "rldefs.h" to the top of several source files, and if you use the VPATH feature, you will have to add dependencies of the form foo.o: foo.c to the Makefile for several values of foo. - The readline library requires use of the termcap library. A known problem with this is that it contains entry points which cause conflicts with the STDWIN and SGI GL libraries. The STDWIN conflict can be solved (and will be, in the next release of STDWIN) by adding a line saying '#define werase w_erase' to the stdwin.h file (in the STDWIN distribution, subdirectory H). The GL conflict has been solved in the Python configure script by a hack that forces use of the static version of the termcap library. - Check the newsgroup gnu.bash.bug for specific problems with the readline library (I don't read this group but I've been told that it is the place for readline bugs). 3.8. Q. Trouble with socket I/O on older Linux 1.x versions. A. Once you've built Python, use it to run the regen.py script in the Lib/linux1 directory. Apparently the files as distributed don't match the system headers on some Linux versions. 3.9. Q. Trouble with prototypes on Ultrix. A. Ultrix cc seems broken -- use gcc, or edit config.h to #undef HAVE_PROTOTYPES. 3.10. Q. Other trouble building Python on platform X. A. Please email the details to and I'll look into it. Please provide as many details as possible. In particular, if you don't tell me what type of computer and what operating system (and version) you are using it will be difficult for me to figure out what is the matter. If you get a specific error message, please email it to me too. 3.11. Q. How to configure dynamic loading on Linux. A. This is now automatic as long as your Linux version uses the ELF object format (all recent Linuxes do). 3.12. Q: I can't get shared modules to work on Linux 2.0 (Slackware96)? A: This is a bug in the Slackware96 release. The fix is simple: Make sure that there is a link from /lib/libdl.so to /lib/libdl.so.1 so that the following links are setup: /lib/libdl.so -> /lib/libdl.so.1 /lib/libdl.so.1 -> /lib/libdl.so.1.7.14 You may have to rerun the configure script, after rm'ing the config.cache file, before you attempt to rebuild python after this fix. 3.13. Q: Trouble when making modules shared on Linux. A. This happens when you have built Python for static linking and then enable *shared* in the Setup file. Shared library code must be compiled with "-fpic". If a .o file for the module already exist that was compiled for static linking, you must remove it or do "make clean" in the Modules directory. 3.14. Q. How to use threads on Linux. A. [Greg Stein] I built myself a libpthreads.so from the libc.5.3.12 distribution (the binary distribution doesn't have pthreads in it). Then, I configured Python with --with-threads and then tweaked config.h to include a #define _MIT_POSIX_THREADS (or something like that, see /usr/include/pthreads.h). It worked fine at that point. Note that I couldn't get threading to "operate well" with any of the other thread packages. Prior libc versions didn't integrate well with threads, either, so I couldn't use them (e.g. sleep() blocked all threads :-( ). 3.15. Q. Errors when linking with a shared library containing C++ code. A. Link the main Python binary with C++. Change the definition of LINKCC in Modules/Makefile to be your C++ compiler. You may have to edit config.c slightly to make it compilable with C++. 3.16. Q. I built with tkintermodule.c enabled but get "Tkinter not found". A. Tkinter.py (note: upper case T) lives in a subdirectory of Lib, Lib/tkinter. If you are using the default module search path, you probably didn't enable the line in the Modules/Setup file defining TKPATH; if you use the environment variable PYTHONPATH, you'll have to add the proper tkinter subdirectory. 3.17. Q. I built with Tk 4.0 but Tkinter complains about the Tk version. A. Several things could cause this. You most likely have a Tk 3.6 installation that wasn't completely eradicated by the Tk 4.0 installation (which tends to add "4.0" to its installed files). You may have the Tk 3.6 support library installed in the place where the Tk 4.0 support files should be (default /usr/local/lib/tk/); you may have compiled Python with the old tk.h header file (yes, this actually compiles!); you may actually have linked with Tk 3.6 even though Tk 4.0 is also around. Similar for Tcl 7.4 vs. Tcl 7.3. 3.18. Q. Link errors for Tcl/Tk symbols when linking with Tcl/Tk. Quite possibly, there's a version mismatch between the Tcl/Tk header files (tcl.h and tk.h) and the tck/tk libraries you are using (the "-ltk4.0" and "-ltcl7.4" arguments for _tkinter in the Setup file). If you have installed both versions 7.4/4.0 and 7.5/4.1 of Tcl/Tk, most likely your header files are for The newer versions, but the Setup line for _tkinter in some Python distributions references 7.4/4.0 by default. Changing this to 7.5/4.1 should take care of this. 3.19. Q. I configured and built Python for Tcl/Tk but "import Tkinter" fails. A. Most likely, you forgot to enable the line in Setup that says "TKPATH=:$(DESTLIB)/tkinter". 3.20. Q. Tk doesn't work right on DEC Alpha. A. You probably compiled either Tcl, Tk or Python with gcc. Don't. For this platform, which has 64-bit integers, gcc is known to generate broken code. The standard cc (which comes bundled with the OS!) works. If you still prefer gcc, at least try recompiling with cc before reporting problems to the newsgroup or the author; if this fixes the problem, report the bug to the gcc developers instead. (As far as we know, there are no problem with gcc on other platforms -- the instabilities seem to be restricted to the DEC Alpha.) See also question 3.6. 3.21. Q. Several common system calls are missing from the posix module. A. Most likely, *all* test compilations run by the configure script are failing for some reason or another. Have a look in config.log to see what could be the reason. A common reason is specifying a directory to the --with-readline option that doesn't contain the libreadline.a file. 3.22. Q. ImportError: No module named string, on MS Windows. A. Most likely, your PYTHONPATH environment variable should be set to something like: set PYTHONPATH=c:\python;c:\python\lib;c:\python\scripts (assuming Python was installed in c:\python) 3.23. Q. Core dump on SGI when using the gl module. There are conflicts between entry points in the termcap and curses libraries and an entry point in the GL library. There's a hack of a fix for the termcap library if it's needed for the GNU readline library, but it doesn't work when you're using curses. Concluding, you can't build a Python binary containing both the curses and gl modules. 4. Programming in Python ======================== 4.1. Q. Is there a source code level debugger with breakpoints, step, etc.? A. Yes. Check out module pdb; pdb.help() prints the documentation (or you can read it as Lib/pdb.doc). If you use the STDWIN option, there's also a windowing interface, wdb. You can write your own debugger by using the code for pdb or wdb as an example. 4.2. Q. Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)? (Also phrased as: Can I use a built-in type as base class?) A. No, but you can easily create a Python class which serves as a wrapper around a built-in object, e.g. (for dictionaries): # A user-defined class behaving almost identical # to a built-in dictionary. class UserDict: def __init__(self): self.data = {} def __repr__(self): return repr(self.data) def __cmp__(self, dict): if type(dict) == type(self.data): return cmp(self.data, dict) else: return cmp(self.data, dict.data) def __len__(self): return len(self.data) def __getitem__(self, key): return self.data[key] def __setitem__(self, key, item): self.data[key] = item def __delitem__(self, key): del self.data[key] def keys(self): return self.data.keys() def items(self): return self.data.items() def values(self): return self.data.values() def has_key(self, key): return self.data.has_key(key) A2. See Jim Fulton's ExtensionClass for an example of a mechanism which allows you to have superclasses which you can inherit from in Python -- that way you can have some methods from a C superclass (call it a mixin) and some methods from either a Python superclass or your subclass. See . 4.3. Q. Is there a curses/termcap package for Python? A. Yes -- Lance Ellinghaus has written a module that interfaces to System V's "ncurses". If you know a little curses and some Python, it's straightforward to use. It is part of the standard Python distribution, but not configured by default -- you must enable it by editing Modules/Setup. It requires a System V curses implementation. You could also consider using the "alfa" (== character cell) version of STDWIN. (Standard Window System Interface, a portable windowing system interface by myself .) This will also prepare your program for porting to windowing environments such as X11 or the Macintosh. 4.4. Q. Is there an equivalent to C's onexit() in Python? A. Yes, if you import sys and assign a function to sys.exitfunc, it will be called when your program exits, is killed by an unhandled exception, or (on UNIX) receives a SIGHUP or SIGTERM signal. 4.5. Q. When I define a function nested inside another function, the nested function seemingly can't access the local variables of the outer function. What is going on? How do I pass local data to a nested function? A. Python does not have arbitrarily nested scopes. When you need to create a function that needs to access some data which you have available locally, create a new class to hold the data and return a method of an instance of that class, e.g.: class MultiplierClass: def __init__(self, factor): self.factor = factor def multiplier(self, argument): return argument * self.factor def generate_multiplier(factor): return MultiplierClass(factor).multiplier twice = generate_multiplier(2) print twice(10) # Output: 20 An alternative solution uses default arguments, e.g.: def generate_multiplier(factor): def multiplier(arg, fact = factor): return arg*fact return multiplier twice = generate_multiplier(2) print twice(10) # Output: 20 4.6. Q. How do I iterate over a sequence in reverse order? A. If it is a list, the fastest solution is list.reverse() try: for x in list: "do something with x" finally: list.reverse() This has the disadvantage that while you are in the loop, the list is temporarily reversed. If you don't like this, you can make a copy. This appears expensive but is actually faster than other solutions: rev = list[:] rev.reverse() for x in rev: If it isn't a list, a more general but slower solution is: i = len(list) while i > 0: i = i-1 x = list[i] A more elegant solution, is to define a class which acts as a sequence and yields the elements in reverse order (solution due to Steve Majewski): class Rev: def __init__(self, seq): self.forw = seq def __len__(self): return len(self.forw) def __getitem__(self, i): return self.forw[-(i + 1)] You can now simply write: for x in Rev(list): Unfortunately, this solution is slowest of all, due to the method call overhead... 4.7. Q. My program is too slow. How do I speed it up? A. That's a tough one, in general. There are many tricks to speed up Python code; I would consider rewriting parts in C only as a last resort. One thing to notice is that function and (especially) method calls are rather expensive; if you have designed a purely OO interface with lots of tiny functions that don't do much more than get or set an instance variable or call another method, you may consider using a more direct way, e.g. directly accessing instance variables. Also see the standard module "profile" (described in the file "python/lib/profile.doc") which makes it possible to find out where your program is spending most of its time (if you have some patience -- the profiling itself can slow your program down by an order of magnitude). 4.8. Q. When I have imported a module, then edit it, and import it again (into the same Python process), the changes don't seem to take place. What is going on? A. For reasons of efficiency as well as consistency, Python only reads the module file on the first time a module is imported. (Otherwise a program consisting of many modules, each of which imports the same basic module, would read the basic module over and over again.) To force rereading of a changed module, do this: import modname reload(modname) Warning: this technique is not 100% fool-proof. In particular, modules containing statements like from modname import some_objects will continue to work with the old version of the imported objects. 4.9. Q. How do I find the current module name? A. A module can find out its own module name by looking at the (predefined) global variable __name__. If this has the value '__main__' you are running as a script. 4.10. Q. I have a module in which I want to execute some extra code when it is run as a script. How do I find out whether I am running as a script? A. See the previous question. E.g. if you put the following on the last line of your module, main() is called only when your module is running as a script: if __name__ == '__main__': main() 4.11. Q. I try to run a program from the Demo directory but it fails with ImportError: No module named ...; what gives? A. This is probably an optional module (written in C!) which hasn't been configured on your system. This especially happens with modules like "Tkinter", "stdwin", "gl", "Xt" or "Xm". For Tkinter, STDWIN and many other modules, see Modules/Setup.in for info on how to add these modules to your Python, if it is possible at all. Sometimes you will have to ftp and build another package first (e.g. STDWIN). Sometimes the module only works on specific platforms (e.g. gl only works on SGI machines). NOTE: if the complaint is about "Tkinter" (upper case T) and you have already configured module "tkinter" (lower case t), the solution is *not* to rename tkinter to Tkinter or vice versa. There is probably something wrong with your module search path. Check out the value of sys.path. For X-related modules (Xt and Xm) you will have to do more work: they are currently not part of the standard Python distribution. You will have to ftp the Extensions tar file, e.g. and follow the instructions there. See also the next question. 4.12. Q. I have successfully built Python with STDWIN but it can't find some modules (e.g. stdwinevents). A. There's a subdirectory of the library directory named 'stdwin' which should be in the default module search path. There's a line in Modules/Setup(.in) that you have to enable for this purpose -- unfortunately in the latest release it's not near the other STDWIN-related lines so it's easy to miss it. 4.13. Q. What GUI toolkits exist for Python? A. Depending on what platform(s) you are aiming at, there are several. Currently supported solutions: - There's a neat object-oriented interface to the Tcl/Tk widget set, called Tkinter. It is part of the standard Python distribution and well-supported -- all you need to do is build and install Tcl/Tk and enable the _tkinter module and the TKPATH definition in Modules/Setup when building Python. This is probably the easiest to install and use, and the most complete widget set. It is also very likely that in the future the standard Python GUI API will be based on or at least look very much like the Tkinter interface. For more info about Tk, including pointers to the source, see the Tcl/Tk home page . Tcl/Tk is now fully portable to the Mac and Windows platforms (NT and 95 only); you need Python 1.4beta3 or later and Tk 4.1patch1 or later. - There's an interface to X11, including the Athena and Motif widget sets (and a few individual widgets, like Mosaic's HTML widget and SGI's GL widget) available from . Support by Sjoerd Mullender . - On top of the X11 interface there's the (recently revived) vpApp toolkit by Per Spilling, now also maintained by Sjoerd Mullender . See . - The Mac port has a rich and ever-growing set of modules that support the native Mac toolbox calls. See the documentation that comes with the Mac port. See . Support by Jack Jansen . - The NT port supported by Mark Hammond (see question 7.2) includes an interface to the Microsoft Foundation Classes and a Python programming environment using it that's written mostly in Python. See . - There's an object-oriented GUI based on the Microsoft Foundation Classes model called WPY, supported by Jim Ahlstrom . Programs written in WPY run unchanged and with native look and feel on Windows NT/95, Windows 3.1 (using win32s), and on Unix (using Tk). Source and binaries for Windows and Linux are available in . Obsolete or minority solutions: - There's an interface to wxWindows. wxWindows is a portable GUI class library written in C++. It supports XView, Motif, MS-Windows as targets. There is some support for Macs and CURSES as well. wxWindows preserves the look and feel of the underlying graphics toolkit. See the wxPython WWW page at . Support for wxPython (by Harri Pasanen ) appears to have a low priority. - For SGI IRIX only, there are unsupported interfaces to the complete GL (Graphics Library -- low level but very good 3D capabilities) as well as to FORMS (a buttons-and-sliders-etc package built on top of GL by Mark Overmars -- ftp'able from ). This is probably also becoming obsolete, as OpenGL takes over. - There's an interface to STDWIN, a platform-independent low-level windowing interface for Mac and X11. This is totally unsupported and rapidly becoming obsolete. The STDWIN sources are at . (For info about STDWIN 2.0, please refer to Steven Pemberton -- I believe it is also dead.) - There once was an interface to WAFE, a Tcl interface to the X11 Motif and Athena widget sets. WAFE is at . It's not clear what the status of the Python support is. - (The Fresco port that was mentioned in earlier versions of this FAQ no longer seems to exist. Inquire with Mark Linton.) 4.14. Q. Are there any interfaces to database packages in Python? A. There's a whole collection of them in the contrib area of the ftp server, see . 4.15. Q. Is it possible to write obfuscated one-liners in Python? A. Yes. See the following three examples, due to Ulf Bartelt: # Primes < 1000 print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0, map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000))) # First 10 Fibonacci numbers print map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f), range(10)) # Mandelbrot set print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y, Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM, Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro, i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y >=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr( 64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy ))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24) # \___ ___/ \___ ___/ | | |__ lines on screen # V V | |______ columns on screen # | | |__________ maximum of "iterations" # | |_________________ range on y axis # |____________________________ range on x axis Don't try this at home, kids! 4.16. Q. Is there an equivalent of C's "?:" ternary operator? A. Not directly. In many cases you can mimic a?b:c with "a and b or c", but there's a flaw: if b is zero (or empty, or None -- anything that tests false) then c will be selected instead. In many cases you can prove by looking at the code that this can't happen (e.g. because b is a constant or has a type that can never be false), but in general this can be a problem. Tim Peters (who wishes it was Steve Majewski) suggested the following solution: (a and [b] or [c])[0]. Because [b] is a singleton list it is never false, so the wrong path is never taken; then applying [0] to the whole thing gets the b or c that you really wanted. Ugly, but it gets you there in the rare cases where it is really inconvenient to rewrite your code using 'if'. 4.17. Q. My class defines __del__ but it is not called when I delete the object. A. There are several possible reasons for this. - The del statement does not necessarily call __del__ -- it simply decrements the object's reference count, and if this reaches zero __del__ is called. - If your data structures contain circular links (e.g. a tree where each child has a parent pointer and each parent has a list of children) the reference counts will never go back to zero. You'll have to define an explicit close() method which removes those pointers. Please don't ever call __del__ directly -- __del__ should call close() and close() should make sure that it can be called more than once for the same object. - If the object has ever been a local variable (or argument, which is really the same thing) to a function that caught an expression in an except clause, chances are that a reference to the object still exists in that function's stack frame as contained in the stack trace. Normally, deleting (better: assigning None to) sys.exc_traceback will take care of this. If you a stack was printed for an unhandled exception in an interactive interpreter, delete sys.last_traceback instead. - There is code that deletes all objects when the interpreter exits, but if your Python has been configured to support threads, it is not called (because other threads may still be active). You can define your own cleanup function using sys.exitfunc (see question 4.4). - Finally, if your __del__ method raises an exception, this will be ignored. Starting with Python 1.4beta3, a warning message is printed to sys.stderr when this happens. 4.18. Q. How do I change the shell environment for programs called using os.popen() or os.system()? Changing os.environ doesn't work. A. You must be using either a version of python before 1.4, or on a (rare) system that doesn't have the putenv() library function. Before Python 1.4, modifying the environment passed to subshells was left out of the interpreter because there seemed to be no well-established portable way to do it (in particular, some systems, have putenv(), others have setenv(), and some have none at all). As of Python 1.4, almost all Unix systems *do* have putenv(), and so does the Win32 API, and thus the os module was modified so that changes to os.environ are trapped and the corresponding putenv() call is made. 4.19. Q. What is a class? A. A class is the particular object type that is created by executing a class statement. Class objects are used as templates, to create class instance objects, which embody both the data structure and program routines specific to a datatype. 4.20. Q. What is a method? A. A method is a function that you normally call as x.name(arguments...) for some object x. The term is used for methods of classes and class instances as well as for methods of built-in objects. (The latter have a completely different implementation and only share the way their calls look in Python code.) Methods of classes (and class instances) are defined as functions inside the class definition. 4.21. Q. What is self? A. Self is merely a conventional name for the first argument of a method -- i.e. a function defined inside a class definition. A method defined as meth(self, a, b, c) should be called as x.meth(a, b, c) for some instance x of the class in which the definition occurs; the called method will think it is called as meth(x, a, b, c). 4.22. Q. What is a unbound method? A. An unbound method is a method defined in a class that is not yet bound to an instance. You get an unbound method if you ask for a class attribute that happens to be a function. You get a bound method if you ask for an instance attribute. A bound method knows which instance it belongs to and calling it supplies the instance automatically; an unbound method only knows which class it wants for its first argument (a derived class is also OK). Calling an unbound method doesn't "magically" derive the first argument from the context -- you have to provide it explicitly. 4.23. Q. How do I call a method defined in a base class from a derived class that overrides it? A. If your class definition starts with "class Derived(Base): ..." then you can call method meth defined in Base (or one of Base's base classes) as Base.meth(self, arguments...). Here, Base.meth is an unbound method (see previous question). 4.24. Q. How do I call a method from a base class without using the name of the base class? A. DON'T DO THIS. REALLY. I MEAN IT. It appears that you could call self.__class__.__bases__[0].meth(self, arguments...) but this fails when a doubly-derived method is derived from your class: for its instances, self.__class__.__bases__[0] is your class, not its base class -- so (assuming you are doing this from within Derived.meth) you would start a recursive call. 4.25. Q. How can I organize my code to make it easier to change the base class? A. You could define an alias for the base class, assign the real base class to it before your class definition, and use the alias throughout your class. Then all you have to change is the value assigned to the alias. Incidentally, this trick is also handy if you want to decide dynamically (e.g. depending on availability of resources) which base class to use. Example: BaseAlias = class Derived(BaseAlias): def meth(self): BaseAlias.meth(self) ... 4.26. Q. How can I find the methods or attributes of an object? A. This depends on the object type. For an instance x of a user-defined class, instance attributes are found in the dictionary x.__dict__, and methods and attributes defined by its class are found in x.__class__.__bases__[i].__dict__ (for i in range(len(x.__class__.__bases__))). You'll have to walk the tree of base classes to find *all* class methods and attributes. Many, but not all built-in types define a list of their method names in x.__methods__, and if they have data attributes, their names may be found in x.__members__. However this is only a convention. For more information, read the source of the standard (but undocumented) module newdir. 4.27. Q. I can't seem to use os.read() on a pipe created with os.popen(). A. os.read() is a low-level function which takes a file descriptor (a small integer). os.popen() creates a high-level file object -- the same type used for sys.std{in,out,err} and returned by the builtin open() function. Thus, to read n bytes from a pipe p created with os.popen(), you need to use p.read(n). 4.28. Q. How can I create a stand-alone binary from a Python script? The demo script "Demo/scripts/freeze.py" does what you want. (It's actually not a demo but a support tool -- there is some extra code in the interpreter to accommodate it.) It requires that you have the Python build tree handy, complete with all the lib*.a files. This works by scanning your source recursively for import statements (both forms) and looking for the modules on the standard Python path as well as in the source directory (for built-in modules). It then "compiles" the modules written in Python to C code (array initializers that can be turned into code objects using the marshal module) and creates a custom-made config file that only contains those built-in modules which are actually used in the program. It then compiles the generated C code and links it with the rest of the Python interpreter to form a self-contained binary which acts exactly like your script. Hint: the freeze program only works if your script's filename ends in ".py". 4.29. Q. What WWW tools are there for Python? A. See the chapter titled "Internet and WWW" in the Library Reference Manual. There's also a web browser written in Python, called Grail -- see . Steve Miale has written a modular WWW browser called Dancer. An alpha version can be FTP'ed from . (There are a few articles about Dancer in the (hyper)mail archive .) 4.30. Q. How do I run a subprocess with pipes connected to both input and output? A. This is really a UNIX question. Also, in general, it is unwise to do so, because you can easily cause a deadlock where the parent process is blocked waiting for output from the child, while the child is blocked waiting for input from the child. This can be caused because the parent expects the child to output more text than it does, or it can be caused by data being stuck in stdio buffers due to lack of flushing. The Python parent can of course explicitly flush the data it sends to the child before it reads any output, but if the child is a naive C program it can easily have been written to never explicitly flush its output, even if it is interactive, since flushing is normally automatic. In many cases, all you really need is to run some data through a command and get the result back. Unless the data is infinite in size, the easiest (and often the most efficient!) way to do this is to write it to a temporary file and run the command with that temporary file as input. The standard module tempfile exports a function mktemp() which generates unique temporary file names. If after reading all of the above you still want to connect two pipes to a subprocess's standard input and output, here's a simple solution, due to Jack Jansen: import os import sys import string MAXFD = 100 # Max number of file descriptors in this system def popen2(cmd): cmd = string.split(cmd) p2cread, p2cwrite = os.pipe() c2pread, c2pwrite = os.pipe() pid = os.fork() if pid == 0: # Child os.close(0) os.close(1) if os.dup(p2cread) != 0: sys.stderr.write('popen2: bad read dup\n') if os.dup(c2pwrite) != 1: sys.stderr.write('popen2: bad write dup\n') for i in range(3, MAXFD): try: os.close(i) except: pass try: os.execv(cmd[0], cmd) finally: os._exit(1) os.close(p2cread) tochild = os.fdopen(p2cwrite, 'w') os.close(c2pwrite) fromchild = os.fdopen(c2pread, 'r') return fromchild, tochild Note that many interactive programs (e.g. vi) don't work well with pipes substituted for standard input and output. You will have to use pseudo ttys ("ptys") instead of pipes. There is some undocumented code to use these in the library module pty.py -- I'm afraid you're on your own here. A different answer is a Python interface to Don Libes' "expect" library. A prerelease of this is available on the Python ftp mirror sites in the contrib subdirectory as expy-0.3.tar.gz, e.g. . 4.31. Q. How do I call a function if I have the arguments in a tuple? A. Use the built-in function apply(). For instance, func(1, 2, 3) is equivalent to args = (1, 2, 3) apply(func, args) Note that func(args) is not the same -- it calls func() with exactly one argument, the tuple args, instead of three arguments, the integers 1, 2 and 3. 4.32. Q. How do I enable font-lock-mode for Python in Emacs? A. Assuming you're already using python-mode and font-lock-mode separately, all you need to do is put this in your .emacs file: (defun my-python-mode-hook () (setq font-lock-keywords python-font-lock-keywords) (font-lock-mode 1)) (add-hook 'python-mode-hook 'my-python-mode-hook) 4.33. Q. Is there an inverse to the format operator (a la C's scanf())? A. Not as such. For simple input parsing, the easiest approach is usually to split the line into whitespace-delimited words using string.split(), and to convert decimal strings to numeric values using string.atoi(), string.atol() or string.atof(). (Python's atoi() is 32-bit and its atol() is arbitrary precision.) If you want to use another delimiter than whitespace, use string.splitfield() (possibly combining it with string.strip() which removes surrounding whitespace from a string). For more complicated input parsing, regular expressions (see module regex) are better suited and more powerful than C's scanf(). 4.34. Q. Can I have Tk events handled while waiting for I/O? A. Yes, and you don't even need threads! But you'll have to restructure your I/O code a bit. Tk has the equivalent of Xt's XtAddInput() call, which allows you to register a callback function which will be called from the Tk mainloop when I/O is possible on a file descriptor. Here's what you need: from Tkinter import tkinter tkinter.createfilehandler(file, mask, callback) The file may be a Python file or socket object (actually, anything with a fileno() method), or an integer file descriptor. The mask is one of the constants tkinter.READABLE or tkinter.WRITABLE. The callback is called as follows: callback(file, mask) You must unregister the callback when you're done, using tkinter.deletefilehandler(file) Note: since you don't know *how many bytes* are available for reading, you can't use the Python file object's read or readline methods, since these will insist on reading a predefined number of bytes. For sockets, the recv() or recvfrom() methods will work fine; for other files, use os.read(file.fileno(), maxbytecount). 4.35. Q. How do I write a function with output parameters (call by reference)? A. [Mark Lutz] The thing to remember is that arguments are passed by assignment in Python. Since assignment just creates references to objects, there's no alias between an argument name in the caller and callee, and so no call-by-reference per se. But you can simulate it in a number of ways: 1) By using global variables; but you probably shouldn't :-) 2) By passing a mutable (changeable in-place) object: def func1(a): a[0] = 'new-value' # 'a' references a mutable list a[1] = a[1] + 1 # changes a shared object args = ['old-value', 99] func1(args) print args[0], args[1] # output: new-value 100 3) By return a tuple, holding the final values of arguments: def func2(a, b): a = 'new-value' # a and b are local names b = b + 1 # assigned to new objects return a, b # return new values x, y = 'old-value', 99 x, y = func2(x, y) print x, y # output: new-value 100 4) And other ideas that fall-out from Python's object model. For instance, it might be clearer to pass in a mutable dictionary: def func3(args): args['a'] = 'new-value' # args is a mutable dictionary args['b'] = args['b'] + 1 # change it in-place args = {'a':' old-value', 'b': 99} func3(args) print args['a'], args['b'] 5) Or bundle-up values in a class instance: class callByRef: def __init__(self, **args): for (key, value) in args.items(): setattr(self, key, value) def func4(args): args.a = 'new-value' # args is a mutable callByRef args.b = args.b + 1 # change object in-place args = callByRef(a='old-value', b=99) func4(args) print args.a, args.b But there's probably no good reason to get this complicated :-). [Python' author favors solution 3 in most cases.] 4.36. Q. Please explain the rules for local and global variables in Python. A. [Ken Manheimer] In Python, procedure variables are implicitly global, unless they assigned anywhere within the block. In that case they are implicitly local, and you need to explicitly declare them as 'global'. Though a bit surprising at first, a moments consideration explains this. On one hand, requirement of 'global' for assigned vars provides a bar against unintended side-effects. On the other hand, if global were required for all global references, you'd be using global all the time. Eg, you'd have to declare as global every reference to a builtin function, or to a component of an imported module. This clutter would defeat the usefulness of the 'global' declaration for identifying side-effects. 4.37. Q. How can I have modules that mutually import each other? A. Jim Roskind recommends the following order in each module: First: all exports (like globals, functions, and classes that don't need imported bases classes). Then: all import statements. Finally: all active code (including globals that are initialized from imported values). Python's author doesn't like this approach much because the imports appear in a strange place, but has to admit that it works. His recommended strategy is to avoid all uses of "from import *" (so everything from an imported module is referenced as .) and to place all code inside functions. Initializations of global variables and class variables should use constants or built-in functions only. 4.38. Q. How do I copy an object in Python? A. There is no generic copying operation built into Python, however most object types have some way to create a clone. Here's how for the most common objects: - For immutable objects (numbers, strings, tuples), cloning is unnecessary since their value can't change. - For lists (and generally for mutable sequence types), a clone is created by the expression l[:]. - For dictionaries, the following function returns a clone: def dictclone(o): n = {} for k in o.keys(): n[k] = o[k] return n - Finally, for generic objects, the "copy" module defines two functions for copying objects. copy.copy(x) returns a copy as shown by the above rules. copy.deepcopy(x) also copies the elements of composite objects. See the section on this module in the Library Reference Manual. 4.39. Q. How to implement persistent objects in Python? (Persistent == automatically saved to and restored from disk.) A. The library module "pickle" now solves this in a very general way (though you still can't store things like open files, sockests or windows), and the library module "shelve" uses pickle and (g)dbm to create presistent mappings containing arbitrary Python objects. 4.40. Q. I try to use __spam and I get an error about _SomeClassName__spam. A. Variables with double leading underscore are "mangled" to provide a simple but effective way to define class private variables. See the chapter "New in Release 1.4" in the Python Tutorial. 4.41. Q. How do I delete a file? And other file questions. A. Use os.remove(filename) or os.unlink(filename); for documentation, see the posix section of the library manual. They are the same, unlink() is simply the Unix name for this function. In earlier versions of Python, only os.unlink() was available. To remove a directory, use os.rmdir(); use os.mkdir() to create one. To rename a file, use os.rename(). To truncate a file, open it using f = open(filename, "w+"), and use f.truncate(offset); offset defaults to the current seek position. There's also os.ftruncate(fd, offset) for files opened with os.open() -- for advanced Unix hacks only. 4.42. Q. How to modify urllib or httplib to support HTTP/1.1? A. Apply the following patch to httplib.py: 41c41 < replypat = regsub.gsub('\\.', '\\\\.', HTTP_VERSION) + \ --- > replypat = regsub.gsub('\\.', '\\\\.', 'HTTP/1.[0-9]+') + \ 4.43. Q. Unexplicable syntax errors in compile() or exec. A. When a statement suite (as opposed to an expression) is compiled by compile(), exec or execfile(), it *must* end in a newline. In some cases, when the source ends in an indented block it appears that at least two newlines are required. 4.44. Q. How do I convert a string to a number? A. To convert, e.g., the string '144' to the number 144, import the module string and use the string.atoi() function. For floating point numbers, use string.atof(); for long integers, use string.atol(). See the library reference manual section for the string module for more details. While you could use the built-in function eval() instead of any of those, this is not recommended, because someone could pass you a Python expression that might have unwanted side effects (like reformatting your disk). 4.45. Q. How do I convert a number to a string? A. To convert, e.g., the number 144 to the string '144', use the built-in function repr() or the backquote notation (these are equivalent). If you want a hexadecimal or octal representation, use the built-in functions hex() or oct(), respectively. For fancy formatting, use the % operator on strings, just like C printf formats, e.g. "%04d" % 144 yields '0144' and "%.3f" % (1/3.0) yields '0.333'. See the library reference manual for details. 5. Extending Python =================== 5.1. Q. Can I create my own functions in C? A. Yes, you can create built-in modules containing functions, variables, exceptions and even new types in C. This is explained in the document "Extending and Embedding the Python Interpreter" (the LaTeX file Doc/ext.tex). Also read the chapter on dynamic loading. 5.2. Q. Can I create my own functions in C++? A. Yes, using the C-compatibility features found in C++. Basically you place extern "C" { ... } around the Python include files and put extern "C" before each function that is going to be called by the Python interpreter. Global or static C++ objects with constructors are probably not a good idea. 5.3. Q. How can I execute arbitrary Python statements from C? A. The highest-level function to do this is run_command() which takes a single string argument which is executed in the context of module __main__ and returns 0 for success and -1 when an exception occurred (including SyntaxError). If you want more control, use run_string(); see the source for run_command() in Python/pythonrun.c. 5.4. Q. How can I evaluate an arbitrary Python expression from C? A. Call the function run_string() from the previous question with the start symbol eval_input; it then parses an expression, evaluates it and returns its value. See exec_eval() in Python/bltinmodule.c. 5.5. Q. How do I extract C values from a Python object? A. That depends on the object's type. If it's a tuple, gettuplesize(o) returns its length and gettupleitem(o, i) returns its i'th item; similar for lists with getlistsize(o) and getlistitem(o, i). For strings, getstringsize(o) returns its length and getstringvalue(o) a pointer to its value (note that Python strings may contain null bytes so strlen() is not safe). To test which type an object is, first make sure it isn't NULL, and then use is_stringobject(o), is_tupleobject(o), is_listobject(o) etc. 5.6. Q. How do I use mkvalue() to create a tuple of arbitrary length? A. You can't. Use t = newtupleobject(n) instead, and fill it with objects using settupleitem(t, i, o) -- note that this "eats" a reference count of o. Similar for lists with newlistobject(n) and setlistitem(l, i, o). Note that you *must* set all the tuple items to some value before you pass the tuple to Python code -- newtupleobject(n) initializes them to NULL, which isn't a valid Python value. 5.7. Q. How do I call an object's method from C? A. Here's a function (untested) that might become part of the next release in some form. It uses to allow passing the argument list on to vmkvalue(): object *call_method(object *inst, char *methodname, char *format, ...) { object *method; object *args; object *result; va_list va; method = getattr(inst, methodname); if (method == NULL) return NULL; va_start(va, format); args = vmkvalue(format, va); va_end(va); if (args == NULL) { DECREF(method); return NULL; } result = call_object(method, args); DECREF(method); DECREF(args); return result; } This works for any instance that has methods -- whether built-in or user-defined. You are responsible for eventually DECREF'ing the return value. To call, e.g., a file object's "seek" method with arguments 10, 0 (assuming the file object pointer is "f"): res = call_method(f, "seek", "(OO)", 10, 0); if (res == NULL) { ... an exception occurred ... } else { DECREF(res); } Note that since call_object() *always* wants a tuple for the argument list, to call a function without arguments, pass "()" for the format, and to call a function with one argument, surround the argument in parentheses, e.g. "(i)". 5.8. Q. How do I catch the output from print_error()? A. (Due to Mark Hammond): * in Python code, define an object that supports the "write()" method. * redirect sys.stdout and sys.stderr to this object. * call print_error, or just allow the standard traceback mechanism to work. Then, the output will go wherever your write() method sends it. 5.9. Q. How do I access a module written in Python from C? A. You can get a pointer to the module object as follows: module = import_module(""); If the module hasn't been imported yet (i.e. it is not yet present in sys.modules), this initializes the module; otherwise it simply returns the value of sys.modules[""]. Note that it doesn't enter the module into any namespace -- it only ensures it has been initialized and is stored in sys.modules. You can then access the module's attributes (i.e. any name defined in the module) as follows: attr = getattr(module, ""); Calling setattr(), to assign to variables in the module, also works. 5.10. Q. How do I interface to C++ objects from Python? A. Depending on your requirements, there are many approaches. To do this manually, begin by reading the "Extending and Embedding" document (Doc/ext.tex, see also ). Realize that for the Python run-time system, there isn't a whole lot of difference between C and C++ -- so the strategy to build a new Python type around a C structure (pointer) type will also work for C++ objects. A useful automated approach (which also works for C) is SWIG: . 6. Python's design ================== 6.1. Q. Why isn't there a switch or case statement in Python? A. You can do this easily enough with a sequence of if... elif... elif... else. There have been some proposals for switch statement syntax, but there is no consensus (yet) on whether and how to do range tests. 6.2. Q. Why does Python use indentation for grouping of statements? A. Basically I believe that using indentation for grouping is extremely elegant and contributes a lot to the clarity of the average Python program. Most people learn to love this feature after a while. Some arguments for it: - Since there are no begin/end brackets there cannot be a disagreement between grouping perceived by the parser and the human reader. I remember long ago seeing a C fragment like this: if (x <= y) x++; y--; z++; and staring a long time at it wondering why y was being decremented even for x > y... (And I wasn't a C newbie then either.) - Since there are no begin/end brackets, Python is much less prone to coding-style conflicts. In C there are loads of different ways to place the braces (including the choice whether to place braces around single statements in certain cases, for consistency). If you're used to reading (and writing) code that uses one style, you will feel at least slightly uneasy when reading (or being required to write) another style. - Many coding styles place begin/end brackets on a line by themself. This makes programs considerably longer and wastes valuable screen space, making it harder to get a good overview over a program. Ideally, a function should fit on one basic tty screen (say, 20 lines). 20 lines of Python are worth a LOT more than 20 lines of C. This is not solely due to the lack of begin/end brackets (the lack of declarations also helps, and the powerful operations of course), but it certainly helps! 6.3. Q. Why are Python strings immutable? A. There are two advantages. One is performance: knowing that a string is immutable makes it easy to lay it out at construction time -- fixed and unchanging storage requirements. (This is also one of the reasons for the distinction between tuples and lists.) The other is that strings in Python are considered as "elemental" as numbers. No amount of activity will change the value 8 to anything else, and in Python, no amount of activity will change the string "eight" to anything else. (Adapted from Jim Roskind) 6.4. Q. Why don't strings have methods like index() or sort(), like lists? A. Good question. Strings currently don't have methods at all (likewise tuples and numbers). Long ago, it seemed unnecessary to implement any of these functions in C, so a standard library module "string" written in Python was created that performs string related operations. Since then, the cry for performance has moved most of them into the built-in module strop (this is imported by module string, which is still the preferred interface, without loss of performance except during initialization). Some of these functions (e.g. index()) could easily be implemented as string methods instead, but others (e.g. sort()) can't, since their interface prescribes that they modify the object, while strings are immutable (see the previous question). 6.5. Q. Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))? A. Functions are used for those operations that are generic for a group of types and which should work even for objects that don't have methods at all (e.g. numbers, strings, tuples). Also, implementing len(), max(), min() as a built-in function is actually less code than implementing them as methods for each type. One can quibble about individual cases but it's really too late to change such things fundamentally now. 6.6. Q. Why can't I derive a class from built-in types (e.g. lists or files)? A. This is caused by the relatively late addition of (user-defined) classes to the language -- the implementation framework doesn't easily allow it. See the answer to question 4.2 for a work-around. This *may* be fixed in the (distant) future. 6.7. Q. Why must 'self' be declared and used explicitly in method definitions and calls? A. By asking this question you reveal your C++ background. :-) When I added classes, this was (again) the simplest way of implementing methods without too many changes to the interpreter. I borrowed the idea from Modula-3. It turns out to be very useful, for a variety of reasons. First, it makes it more obvious that you are using a method or instance attribute instead of a local variable. Reading "self.x" or "self.meth()" makes it absolutely clear that an instance variable or method is used even if you don't know the class definition by heart. In C++, you can sort of tell by the lack of a local variable declaration (assuming globals are rare or easily recognizable) -- but in Python, there are no local variable declarations, so you'd have to look up the class definition to be sure. Second, it means that no special syntax is necessary if you want to explicitly reference or call the method from a particular class. In C++, if you want to use a method from base class that is overridden in a derived class, you have to use the :: operator -- in Python you can write baseclass.methodname(self, ). This is particularly useful for __init__() methods, and in general in cases where a derived class method wants to extend the base class method of the same name and thus has to call the base class method somehow. Lastly, for instance variables, it solves a syntactic problem with assignment: since local variables in Python are (by definition!) those variables to which a value assigned in a function body (and that aren't explicitly declared global), there has to be some way to tell the interpreter that an assignment was meant to assign to an instance variable instead of to a local variable, and it should preferably be syntactic (for efficiency reasons). C++ does this through declarations, but Python doesn't have declarations and it would be a pity having to introduce them just for this purpose. Using the explicit "self.var" solves this nicely. Similarly, for using instance variables, having to write "self.var" means that references to unqualified names inside a method don't have to search the instance's directories. 6.8. Q. Can't you emulate threads in the interpreter instead of relying on an OS-specific thread implementation? A. Unfortunately, the interpreter pushes at least one C stack frame for each Python stack frame. Also, extensions can call back into Python at almost random moments. Therefore a complete threads implementation requires thread support for C. 6.9. Q. Why can't lambda forms contain statements? A. Python lambda forms cannot contain statements because Python's syntactic framework can't handle statements nested inside expressions. However, in Python, this is not a serious problem. Unlike lambda forms in other languages, where they add functionality, Python lambdas are only a shorthand notation if you're too lazy to define a function. Functions are already first class objects in Python, and can be declared in a local scope. Therefore the only advantage of using a lambda form instead of a locally-defined function is that you'll have to invent a name for the function -- but that's just a local variable to which the function object (which is exactly the same type of object that a lambda form yields) is assigned! 6.10. Q. Why don't lambdas have access to variables defined in the containing scope? A. Because they are implemented as ordinary functions. See question 4.5 above. 6.11. Q. Why can't recursive functions be defined inside other functions? A. See question 4.5 above. 6.12. Q. Why is there no more efficient way of iterating over a dictionary than first constructing the list of keys()? A. Have you tried it? I bet it's fast enough for your purposes! In most cases such a list takes only a few percent of the space occupied by the dictionary -- it needs only 4 bytes (the size of a pointer) per key -- a dictionary costs 8 bytes per key plus between 30 and 70 percent hash table overhead, plus the space for the keys and values -- by necessity all keys are unique objects and a string object (the most common key type) costs at least 18 bytes plus the length of the string. Add to that the values contained in the dictionary, and you see that 4 bytes more per item really isn't that much more memory... A call to dict.keys() makes one fast scan over the dictionary (internally, the iteration function does exist) copying the pointers to the key objects into a pre-allocated list object of the right size. The iteration time isn't lost (since you'll have to iterate anyway -- unless in the majority of cases your loop terminates very prematurely (which I doubt since you're getting the keys in random order). I don't expose the dictionary iteration operation to Python programmers because the dictionary shouldn't be modified during the entire iteration -- if it is, there's a very small chance that the dictionary is reorganized because the hash table becomes too full, and then the iteration may miss some items and see others twice. Exactly because this only occurs rarely, it would lead to hidden bugs in programs: it's easy never to have it happen during test runs if you only insert or delete a few items per iteration -- but your users will surely hit upon it sooner or later. 6.13. Q. Can Python be compiled to machine code, C or some other language? A. Not easily. Python's high level data types, dynamic typing of objects and run-time invocation of the interpreter (using eval() or exec) together mean that a "compiled" Python program would probably consist mostly of calls into the Python run-time system, even for seemingly simple operations like "x+1". Thus, the performance gain would probably be minimal. Internally, Python source code is always translated into a "virtual machine code" or "byte code" representation before it is interpreted (by the "Python virtual machine" or "bytecode interpreter"). In order to avoid the overhead of parsing and translating modules that rarely change over and over again, this byte code is written on a file whose name ends in ".pyc" whenever a module is parsed (from a file whose name ends in ".py"). When the corresponding .py file is changed, it is parsed and translated again and the .pyc file is rewritten. There is no performance difference once the .pyc file has been loaded (the bytecode read from the .pyc file is exactly the same as the bytecode created by direct translation). The only difference is that loading code from a .pyc file is faster than parsing and translating a .py file, so the presence of precompiled .pyc files will generally improve start-up time of Python scripts. If desired, the Lib/compileall.py module/script can be used to force creation of valid .pyc files for a given set of modules. If you are looking for a way to translate Python programs in order to distribute them in binary form, without the need to distribute the interpreter and library as well, have a look at the freeze.py script in the Tools/freeze directory. This creates a single binary file incorporating your program, the Python interpreter, and those parts of the Python library that are needed by your program. Of course, the resulting binary will only run on the same type of platform as that used to create it. Hints for proper usage of freeze.py: - the script must be in a file whose name ends in .py - you must have installed Python fully: make install make libinstall make inclinstall make libainstall 6.14. Q. Why doesn't Python use proper garbage collection? A. It's looking less and less likely that Python will ever get "automatic" garbage collection (GC). For one thing, unless this were added to C as a standard feature, it's a portability pain in the ass. And yes, I know about the Xerox library. It has bits of assembler code for *most* *common* platforms. Not for all. And although it is mostly transparent, it isn't completely transparent (when I once linked Python with it, it dumped core). "Proper" GC also becomes a problem when Python gets embedded into other applications. While in a stand-alone Python it may be fine to replace the standard malloc() and free() with versions provided by the GC library, an application embedding Python may want to have its *own* substitute for malloc() and free(), and may not want Python's. Right now, Python works with anything that implements malloc() and free() properly. Besides, the predictability of destructor calls in Python is kind of attractive. With GC, the following code (which is fine in current Python) will run out of file descriptors long before it runs out of memory: for file in : f = open(file) c = file.read(1) Using the current reference counting and destructor scheme, each new assignment to f closes the previous file. Using GC, this is not guaranteed. Sure, you can think of ways to fix this. But it's not off-the-shelf technology. 7. Using Python on non-UNIX platforms ===================================== 7.1. Q. Is there a Mac version of Python? A. Yes, see the "mac" subdirectory of the distribution sites, e.g. . 7.2. Q. Are there DOS and Windows versions of Python? A. Yes. There is a plethora of not-always-compatible versions. See the "pythonwin", "wpy", "nt" and "pc" subdirectories of the distribution sites. A quick comparison: PythonWin: Extensive support for the 32-bit native Windows API and GUI building using MFC. Windows NT and Windows 95 only (and Windows 3.1(1) using win32s, until Microsoft stops supporting it :-( ). . WPY: Ports to DOS, Windows 3.1(1), Windows 95, Windows NT and OS/2. Also contains a GUI package that offers portability between Windows (not DOS) and Unix, and native look and feel on both. . NT: Basic ports built straight from the 1.4 distribution for Windows 95 and Windows NT. This will eventually provide core support for both PythonWin and WPY on all 32-bit Microsoft platforms. . PC: Old, unsupported ports to DOS, Windows 3.1(1) and OS/2. . 7.3. Q. Is there an OS/2 version of Python? A. Yes, see the "pc" and "wpy" subdirectory of the distribution sites (see above). 7.4. Q. Is there a VMS version of Python? A. Donn Cave did a partial port. The results of his efforts are on public display in <. Someone else is working on a more complete port, for details watch the list. 7.5. Q. What about IBM mainframes, or other non-UNIX platforms? A. I haven't heard about these, except I remember hearing about an OS/9 port and a port to Vxworks (both operating systems for embedded systems). If you're interested in any of this, go directly to the newsgroup and ask there, you may find exactly what you need. For example, a port to MPE/iX 5.0 on HP3000 computers was just announced, see . 7.6. Q. Where are the source or Makefiles for the non-UNIX versions? A. The standard sources can (almost) be used. Additional sources can be found in the platform-specific subdirectories of the distribution. 7.7. Q. What is the status and support for the non-UNIX versions? A. I don't have access to most of these platforms, so in general I am dependent on material submitted by volunteers(*). However I strive to integrate all changes needed to get it to compile on a particular platform back into the standard sources, so porting of the next version to the various non-UNIX platforms should be easy. (*) For the Macintosh, that volunteer is me, with help from Jack Jansen . 7.8. Q. I have a PC version but it appears to be only a binary. Where's the library? A. You still need to copy the files from the distribution directory "python/Lib" to your system. If you don't have the full distribution, you can get the file lib.tar.gz from most ftp sites carrying Python; this is a subset of the distribution containing just those files, e.g. . Once you have installed the library, you need to point sys.path to it. Assuming the library is in C:\misc\python\lib, the following commands will point your Python interpreter to it (note the doubled backslashes -- you can also use single forward slashes instead): >>> import sys >>> sys.path.insert(0, 'C:\\misc\\python\\lib') >>> For a more permanent effect, set the environment variable PYTHONPATH, as follows (talking to a DOS prompt): C> SET PYTHONPATH=C:\misc\python\lib 7.9. Q. Where's the documentation for the Mac or PC version? A. The documentation for the Unix version also applies to the Mac and PC versions. Where applicable, differences are indicated in the text. 7.10. Q. The Mac (PC) version doesn't seem to have any facilities for creating or editing programs apart from entering it interactively, and there seems to be no way to save code that was entered interactively. How do I create a Python program on the Mac (PC)? A. Use an external editor. On the Mac, BBEdit seems to be a popular no-frills text editor. I work like this: start the interpreter; edit a module file using BBedit; import and test it in the interpreter; edit again in BBedit; then use the built-in function reload() to re-read the imported module; etc. Regarding the same question for the PC, Kurt Wm. Hemr writes: "While anyone with a pulse could certainly figure out how to do the same on MS-Windows, I would recommend the NotGNU Emacs clone for MS-Windows. Not only can you easily resave and "reload()" from Python after making changes, but since WinNot auto-copies to the clipboard any text you select, you can simply select the entire procedure (function) which you changed in WinNot, switch to QWPython, and shift-ins to reenter the changed program unit."