Commits

Anonymous committed a10a0f6

Some updates. Still out of date.

Comments (0)

Files changed (1)

 
 Archive-name: python-faq/part1
 Submitted-by: Guido van Rossum <guido@cwi.nl>
-Version: 1.29
-Last-modified: 11 October 1995
+Version: 1.31
+Last-modified: 26 June 1996
 
 This article contains answers to Frequently Asked Questions about
 Python (an object-oriented interpreted programming language -- see
 Email:  <guido@python.org>, <guido@cnri.reston.va.us>, <guido@cwi.nl>
 
 The latest version of this FAQ is available by anonymous ftp from
-<URL:ftp://ftp.python.org/pub/doc/FAQ>.  It will also be posted
+<URL:ftp://ftp.python.org/pub/python/doc/FAQ>.  It will also be posted
 regularly to the newsgroups comp.answers <URL:news:comp.answers> and
 comp.lang.python <URL:news:comp.lang.python>.
 
   3.7. Q. I use VPATH but some targets are built in the source directory.
   3.8. Q. Trouble building or linking with the GNU readline library.
   3.9. Q. Trouble building Python on Linux.
-  3.10. Q. Trouble with prototypes on Ultrix.
-  3.11. Q. Trouble with posix.listdir on NeXTSTEP 3.2.
-  3.12. Q. Other trouble building Python on platform X.
-  3.13. Q. How to configure dynamic loading on Lixux.
-  3.14. Q. Under Solaris 2.x, using GCC, how do I use shared libraries?
-  3.15. Q. Errors when linking with a shared library containing C++ code.
-  3.16. Q. Tk menus or radiobuttons don't work properly in Python 1.2.
-  3.17. Q. I built with _tkintermodule.c enabled but get "Tkinter not found".
-  3.18. Q. I built with Tk 4.0 but Tkinter complains about the Tk version.
-  3.19. Q. Tk doesn't work right on DEC Alpha.
+  3.10. Q. Trouble with socket I/O on Linux.
+  3.11. Q. Trouble with prototypes on Ultrix.
+  3.12. Q. Trouble with posix.listdir on NeXTSTEP 3.2.
+  3.13. Q. Other trouble building Python on platform X.
+  3.14. Q. How to configure dynamic loading on Linux.
+  3.15. Q. Under Solaris 2.x, using GCC, how do I use shared libraries?
+  3.16. Q. Errors when linking with a shared library containing C++ code.
+  3.17. Q. Tk menus or radiobuttons don't work properly in Python 1.2.
+  3.18. Q. I built with tkintermodule.c enabled but get "Tkinter not found".
+  3.19. Q. I built with Tk 4.0 but Tkinter complains about the Tk version.
+  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,
   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)?
 
  5. Extending Python
   5.1. Q. Can I create my own functions in C?
 Apart from this, Python builds and runs fine on most Linux versions
 (if you run into trouble on an old Linux version, consider upgrading).
 
-3.10. Q. Trouble with prototypes on Ultrix.
+3.10. Q. Trouble with socket I/O on Linux.
+
+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.11. Q. Trouble with prototypes on Ultrix.
 
 A. Ultrix cc seems broken -- use gcc, or edit config.h to #undef
 HAVE_PROTOTYPES.
 
-3.11. Q. Trouble with posix.listdir on NeXTSTEP 3.2.
+3.12. Q. Trouble with posix.listdir on NeXTSTEP 3.2.
 
 A.  (This often manifests itself as a weird error from the
 compileall.py script run by "make libinstall".)
 "-posix" switch is different; in this particular case, cc is right and
 gcc is wrong.
 
-3.12. Q. Other trouble building Python on platform X.
+3.13. Q. Other trouble building Python on platform X.
 
 A. Please email the details to <guido@cwi.nl> and I'll look into it.
 Please provide as many details as possible.  In particular, if you
 is the matter.  If you get a specific error message, please email it
 to me too.
 
-3.13. Q. How to configure dynamic loading on Lixux.
+3.14. Q. How to configure dynamic loading on Linux.
 
 A. There are two answers, depending on whether you are using the new
 ELF object format or not.
 
     4) Recompile Python.
 
-3.14. Q. Under Solaris 2.x, using GCC, how do I use shared libraries?
+3.15. Q. Under Solaris 2.x, using GCC, how do I use shared libraries?
 
 A. Use the linker in /usr/ucb/ld, not the GNU linker.  The latter
 cannot create shared libraries.
 
-3.15. Q. Errors when linking with a shared library containing C++ code.
+3.16. 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. Tk menus or radiobuttons don't work properly in Python 1.2.
+3.17. Q. Tk menus or radiobuttons don't work properly in Python 1.2.
 
 A. There's a bug in Tkinter.py; remove ClassType and InstanceType from
 the definition of CallableTypes near the top of Lib/tkinter/Tkinter.py.
 
-3.17. Q. I built with _tkintermodule.c enabled but get "Tkinter not found".
+3.18. 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
 TKPATH; if you use the environment variable PYTHONPATH, you'll have to
 add  the proper tkinter subdirectory.
 
-3.18. Q. I built with Tk 4.0 but Tkinter complains about the Tk version.
+3.19. 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
 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.19. Q. Tk doesn't work right on DEC Alpha.
+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
 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
 ========================
 machines).
 
 NOTE: if the complaint is about "Tkinter" (upper case T) and you have
-already configured module "_tkinter" (lower case t and underscore),
-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.
+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
                         # Child
                         os.close(0)
                         os.close(1)
-                        if os.dup(p2cread) <> 0:
+                        if os.dup(p2cread) != 0:
                                 sys.stderr.write('popen2: bad read dup\n')
-                        if os.dup(c2pwrite) <> 1:
+                        if os.dup(c2pwrite) != 1:
                                 sys.stderr.write('popen2: bad write dup\n')
                         for i in range(3, MAXFD):
                                 try:
 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.]
+
 
 5. Extending Python
 ===================