intermediate version -- why not...
This commit is contained in:
parent
ec4982761b
commit
796b259a1c
170
Misc/FAQ
170
Misc/FAQ
|
@ -6,7 +6,7 @@ Reply-to: guido@cwi.nl (Guido van Rossum)
|
|||
Approved: news-answers-request@MIT.Edu
|
||||
|
||||
Archive-name: python-faq/part1
|
||||
Version: 1.18
|
||||
Version: 1.19--
|
||||
Last-modified: 2 January 1995
|
||||
|
||||
This article contains answers to Frequently Asked Questions about
|
||||
|
@ -24,7 +24,7 @@ Author's address:
|
|||
P.O. Box 94079
|
||||
1090 GB Amsterdam
|
||||
The Netherlands
|
||||
Email: guido@cwi.nl
|
||||
Email: <guido@cwi.nl>
|
||||
|
||||
The latest version of this FAQ is available by anonymous ftp from
|
||||
<URL:ftp://ftp.cwi.nl/pub/python/python-FAQ>. It will also be posted
|
||||
|
@ -42,9 +42,6 @@ the archive by e-mail if you have no ftp access. You send a e-mail
|
|||
message to <mail-server@rtfm.mit.edu> containing the single word help
|
||||
in the message body to receive instructions.
|
||||
|
||||
Skip Montanaro <skip@automatrix.com> maintains an HTML version of this
|
||||
FAQ, <URL:http://www.automatrix.com/~skip/python-faq.html>.
|
||||
|
||||
This FAQ is divided in the following chapters:
|
||||
|
||||
1. General information and availability
|
||||
|
@ -153,6 +150,8 @@ Here's an overview of the questions per chapter:
|
|||
4.28. Q. How can I create a stand-alone binary from a Python script?
|
||||
4.29. Q. Is there a special lib for writing CGI scripts in Python?
|
||||
4.30. Q. What other WWW tools are there for Python?
|
||||
4.31. Q. How do I run a subprocess with pipes connected to both input
|
||||
and output?
|
||||
|
||||
5. Extending Python
|
||||
5.1. Q. Can I create my own functions in C?
|
||||
|
@ -161,7 +160,7 @@ Here's an overview of the questions per chapter:
|
|||
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. What happened to mktuple(), featuring in an example in the
|
||||
5.7. Q. What happened to mktuple(), featured in an example in the
|
||||
Extensions manual?
|
||||
5.8. Q. How do I call an object's method from C?
|
||||
5.9. Q. How do I catch the output from print_error()?
|
||||
|
@ -235,7 +234,7 @@ down).
|
|||
|
||||
1.2. Q. Why is it called Python?
|
||||
|
||||
A. Apart from being a computer wizard, I'm also a fan of "Monty
|
||||
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.
|
||||
|
@ -297,8 +296,7 @@ A. There is a newsgroup, comp.lang.python <URL:news: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 <python-list-request@cwi.nl> to
|
||||
(un)subscribe to the mailing list
|
||||
<URL:mailto:python-list-request@cwi.nl>. Hypermail archives of
|
||||
(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,
|
||||
<URL:http://www.cwi.nl/~guido/hypermail/index.html>. The raw archives
|
||||
|
@ -419,7 +417,7 @@ included in the list above, send me email!
|
|||
2.3. Q. Are there any commercial projects going on using Python?
|
||||
|
||||
A. Several companies have revealed to me that they are planning or
|
||||
considering to use Python in a future product.
|
||||
considering use of Python in a future product.
|
||||
|
||||
The furthest is Sunrise Software, who already have a product out using
|
||||
Python -- they use Python for a GUI management application and an SNMP
|
||||
|
@ -540,10 +538,10 @@ A. Get STDWIN 0.9.9 <URL:ftp://ftp.cwi.nl/pub/stdwin/stdwin0.9.9.tar.gz>.
|
|||
|
||||
3.4. Q. Link errors building Python with STDWIN 0.9.9.
|
||||
|
||||
A. Probably routines like 'tereate', 'tenew' etc. The STDWIN 0.9.9
|
||||
distribution requires that you add TWO libraries from stdwin to the
|
||||
line for stdwin in the Setupfile. Use something like this (all on one
|
||||
line!):
|
||||
A. The linker probably complains that it can't find routines like
|
||||
'tecreate', 'tenew' etc. The STDWIN 0.9.9 distribution requires that
|
||||
you add TWO libraries from stdwin to the line for stdwin in the
|
||||
Setupfile. Use something like this (all on one line!):
|
||||
|
||||
stdwin stdwinmodule.c -I$(STDWIN)/H $(STDWIN)/Packs/textedit/libtextedit.a $(STDWIN)/Ports/x11/libstdwin.a -lX11
|
||||
|
||||
|
@ -601,7 +599,7 @@ A. Consider using readline 2.0. From the Python 1.1 README:
|
|||
|
||||
- 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 build the GNU
|
||||
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
|
||||
|
@ -664,31 +662,25 @@ HAVE_PROTOTYPES.
|
|||
|
||||
3.13. Q. Trouble with posix.listdir on NeXTSTEP 3.2.
|
||||
|
||||
A. The problem seems to be that that the NeXT posix library and the
|
||||
NeXT dynamic loading library are incompatible. Mike Carlton reports
|
||||
that the following worked for him (from a clean 1.1 distribution):
|
||||
A. If you built 1.2, you probably forgot to pass -posix as mentioned
|
||||
in the README file -- this links with the right version of the
|
||||
libraries. If you built an earlier version, that's also your problem
|
||||
(edit Makefile to add it to OPT), but you also need to remove this
|
||||
NeXT-specific section from import.c:
|
||||
|
||||
1) ./configure
|
||||
2) edited config.status and changed
|
||||
OPT='-O'
|
||||
to
|
||||
OPT='-posix -O'
|
||||
3) edited Python/import.c and commented out the section
|
||||
#if defined(NeXT) || defined(WITH_RLD)
|
||||
#define DYNAMIC_LINK
|
||||
#define USE_RLD
|
||||
#endif
|
||||
this disables dynamic loading
|
||||
4) make
|
||||
|
||||
3.14. Q. Other trouble building Python on platform X.
|
||||
|
||||
A. Please email me the details <URL:mailto:guido@cwi.nl> 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.
|
||||
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
|
||||
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.
|
||||
|
||||
|
||||
4. Programming in Python
|
||||
|
@ -850,10 +842,10 @@ 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
|
||||
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 a changed module being read again, do this:
|
||||
basic module, would read the basic module over and over again.) To
|
||||
force rereading of a changed module, do this:
|
||||
|
||||
import modname
|
||||
reload(modname)
|
||||
|
@ -896,7 +888,7 @@ 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 wring with your module search path. Check out the value of
|
||||
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
|
||||
|
@ -931,7 +923,7 @@ 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 John Ousterhout's home page
|
||||
<URL:http://playground.Sun.COM:80/~ouster/>.
|
||||
<URL:http://playground.sun.com/~ouster/>.
|
||||
|
||||
- The standard Python distribution comes with an interface to STDWIN,
|
||||
a platform-independent low-level windowing interface. You have to ftp
|
||||
|
@ -977,13 +969,16 @@ Athena widget sets. Last I heard about it it was included in the WAFE
|
|||
A. There's an interface to SYBASE by John Redford
|
||||
<jredford@lehman.com>.
|
||||
|
||||
There's also an interface to metalbase by Lance Ellinghaus
|
||||
There's an interface to metalbase by Lance Ellinghaus
|
||||
<lance@markv.com>; it is part of the separate Extensions distribution
|
||||
<URL:ftp://ftp.cwi.nl/pub/python/extensions.tar.gz>.
|
||||
|
||||
Anthony Baxter <anthony.baxter@aaii.oz.au> has written an interface to
|
||||
mSQL (mini-SQL). <URL:ftp://ftp.cwi.nl/pub/python/PymSQL.tar.gz>.
|
||||
|
||||
Tom Culliton <culliton@clark.net> has written an Oracle module. Write
|
||||
him to get a copy of a late BETA version.
|
||||
|
||||
4.15. Q. Is it possible to write obfuscated one-liners in Python?
|
||||
|
||||
A. Yes. See the following three examples, due to Ulf Bartelt:
|
||||
|
@ -1074,31 +1069,34 @@ setenv(), and some have none at all).
|
|||
However if all you want is to pass environment variables to the
|
||||
commands run by os.system() or os.popen(), there's a simple solution:
|
||||
prefix the command string with a couple of variable assignments and
|
||||
export statements. I guess the following would be universal for popen
|
||||
(untested):
|
||||
export statements. The following would be universal for popen:
|
||||
|
||||
import os
|
||||
from commands import mkarg # nifty routine to add shell quoting
|
||||
def epopen(cmd, mode, env = {}):
|
||||
# env is a dictionary of environment variables
|
||||
prefix = ''
|
||||
for key, value in env.values():
|
||||
prefix = prefix + '%s=%s\n' % (key, mkarg(value))
|
||||
for key, value in env.items():
|
||||
prefix = prefix + '%s=%s\n' % (key, mkarg(value)[1:])
|
||||
prefix = prefix + 'export %s\n' % key
|
||||
return os.popen(prefix + cmd, mode)
|
||||
|
||||
4.19. Q. What is a class?
|
||||
|
||||
A. A class is the particular object type that is created by executing
|
||||
a class statement.
|
||||
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 word is used for methods
|
||||
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.
|
||||
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?
|
||||
|
||||
|
@ -1196,13 +1194,6 @@ 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.
|
||||
|
||||
Unfortunately, the current version is very platform-specific, because
|
||||
each platform has its own compilation flags and libraries to link
|
||||
with. You will probably have to edit the freeze.py file to point it
|
||||
to the right directories and tell it about the compilation and link
|
||||
flags for your platform. A new version will be released with Python
|
||||
1.1 -- if you want a peek write to my colleague <Jack.Jansen@cwi.nl>.
|
||||
|
||||
4.29. Q. Is there a special lib for writing CGI scripts in Python?
|
||||
|
||||
A. There's documentation and code for a cgi.py module by Michael McLay
|
||||
|
@ -1229,6 +1220,73 @@ called Dancer. An alpha version can be FTP'ed from
|
|||
few articles about Dancer in the (hyper)mail archive
|
||||
<URL:http://www.cwi.nl/~guido/hypermail/python-1994q3/index.html>.)
|
||||
|
||||
4.31. 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. What's *really* needed is a Python interface to Don
|
||||
Libes' expect library -- any takers?
|
||||
|
||||
|
||||
5. Extending Python
|
||||
===================
|
||||
|
@ -1283,7 +1341,7 @@ 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. What happened to mktuple(), featuring in an example in the
|
||||
5.7. Q. What happened to mktuple(), featured in an example in the
|
||||
Extensions manual?
|
||||
|
||||
A. It's a typo, I meant newtupleobject() (see previous question).
|
||||
|
@ -1537,7 +1595,7 @@ implementation requires thread support for C.
|
|||
6.11. 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 functions.
|
||||
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
|
||||
|
@ -1690,7 +1748,7 @@ 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 pythonlib<version>.tar.gz from most ftp sites
|
||||
carrying Python; this is a subset of the distribution containing just
|
||||
those file, e.g.
|
||||
those files, e.g.
|
||||
<URL:ftp://ftp.cwi.nl/pub/python/pythonlib1.1.tar.gz>.
|
||||
|
||||
Once you have installed the library, you need to point sys.path to it.
|
||||
|
|
Loading…
Reference in New Issue