add files
This commit is contained in:
808
python-3.7.4-docs-html/_sources/faq/design.rst.txt
Normal file
808
python-3.7.4-docs-html/_sources/faq/design.rst.txt
Normal file
@@ -0,0 +1,808 @@
|
||||
======================
|
||||
Design and History FAQ
|
||||
======================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
Why does Python use indentation for grouping of statements?
|
||||
-----------------------------------------------------------
|
||||
|
||||
Guido van Rossum believes 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.
|
||||
|
||||
Since there are no begin/end brackets there cannot be a disagreement between
|
||||
grouping perceived by the parser and the human reader. Occasionally C
|
||||
programmers will encounter a fragment of code like this::
|
||||
|
||||
if (x <= y)
|
||||
x++;
|
||||
y--;
|
||||
z++;
|
||||
|
||||
Only the ``x++`` statement is executed if the condition is true, but the
|
||||
indentation leads you to believe otherwise. Even experienced C programmers will
|
||||
sometimes stare at it a long time wondering why ``y`` is being decremented even
|
||||
for ``x > y``.
|
||||
|
||||
Because there are no begin/end brackets, Python is much less prone to
|
||||
coding-style conflicts. In C there are many different ways to place the braces.
|
||||
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 themselves. This makes
|
||||
programs considerably longer and wastes valuable screen space, making it harder
|
||||
to get a good overview of a program. Ideally, a function should fit on one
|
||||
screen (say, 20--30 lines). 20 lines of Python can do a lot more work than 20
|
||||
lines of C. This is not solely due to the lack of begin/end brackets -- the
|
||||
lack of declarations and the high-level data types are also responsible -- but
|
||||
the indentation-based syntax certainly helps.
|
||||
|
||||
|
||||
Why am I getting strange results with simple arithmetic operations?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
See the next question.
|
||||
|
||||
|
||||
Why are floating-point calculations so inaccurate?
|
||||
--------------------------------------------------
|
||||
|
||||
Users are often surprised by results like this::
|
||||
|
||||
>>> 1.2 - 1.0
|
||||
0.19999999999999996
|
||||
|
||||
and think it is a bug in Python. It's not. This has little to do with Python,
|
||||
and much more to do with how the underlying platform handles floating-point
|
||||
numbers.
|
||||
|
||||
The :class:`float` type in CPython uses a C ``double`` for storage. A
|
||||
:class:`float` object's value is stored in binary floating-point with a fixed
|
||||
precision (typically 53 bits) and Python uses C operations, which in turn rely
|
||||
on the hardware implementation in the processor, to perform floating-point
|
||||
operations. This means that as far as floating-point operations are concerned,
|
||||
Python behaves like many popular languages including C and Java.
|
||||
|
||||
Many numbers that can be written easily in decimal notation cannot be expressed
|
||||
exactly in binary floating-point. For example, after::
|
||||
|
||||
>>> x = 1.2
|
||||
|
||||
the value stored for ``x`` is a (very good) approximation to the decimal value
|
||||
``1.2``, but is not exactly equal to it. On a typical machine, the actual
|
||||
stored value is::
|
||||
|
||||
1.0011001100110011001100110011001100110011001100110011 (binary)
|
||||
|
||||
which is exactly::
|
||||
|
||||
1.1999999999999999555910790149937383830547332763671875 (decimal)
|
||||
|
||||
The typical precision of 53 bits provides Python floats with 15--16
|
||||
decimal digits of accuracy.
|
||||
|
||||
For a fuller explanation, please see the :ref:`floating point arithmetic
|
||||
<tut-fp-issues>` chapter in the Python tutorial.
|
||||
|
||||
|
||||
Why are Python strings immutable?
|
||||
---------------------------------
|
||||
|
||||
There are several advantages.
|
||||
|
||||
One is performance: knowing that a string is immutable means we can allocate
|
||||
space for it at creation time, and the storage requirements are fixed and
|
||||
unchanging. This is also one of the reasons for the distinction between tuples
|
||||
and lists.
|
||||
|
||||
Another advantage 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.
|
||||
|
||||
|
||||
.. _why-self:
|
||||
|
||||
Why must 'self' be used explicitly in method definitions and calls?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
The idea was borrowed from Modula-3. It turns out to be very useful, for a
|
||||
variety of reasons.
|
||||
|
||||
First, it's 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. Some C++ and Java coding standards
|
||||
call for instance attributes to have an ``m_`` prefix, so this explicitness is
|
||||
still useful in those languages, too.
|
||||
|
||||
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 a base class which is overridden in a derived class, you have
|
||||
to use the ``::`` operator -- in Python you can write
|
||||
``baseclass.methodname(self, <argument list>)``. This is particularly useful
|
||||
for :meth:`__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.
|
||||
|
||||
Finally, for instance variables it solves a syntactic problem with assignment:
|
||||
since local variables in Python are (by definition!) those variables to which a
|
||||
value is 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. To put it another way, local
|
||||
variables and instance variables live in two different namespaces, and you need
|
||||
to tell Python which namespace to use.
|
||||
|
||||
|
||||
Why can't I use an assignment in an expression?
|
||||
-----------------------------------------------
|
||||
|
||||
Many people used to C or Perl complain that they want to use this C idiom:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
while (line = readline(f)) {
|
||||
// do something with line
|
||||
}
|
||||
|
||||
where in Python you're forced to write this::
|
||||
|
||||
while True:
|
||||
line = f.readline()
|
||||
if not line:
|
||||
break
|
||||
... # do something with line
|
||||
|
||||
The reason for not allowing assignment in Python expressions is a common,
|
||||
hard-to-find bug in those other languages, caused by this construct:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
if (x = 0) {
|
||||
// error handling
|
||||
}
|
||||
else {
|
||||
// code that only works for nonzero x
|
||||
}
|
||||
|
||||
The error is a simple typo: ``x = 0``, which assigns 0 to the variable ``x``,
|
||||
was written while the comparison ``x == 0`` is certainly what was intended.
|
||||
|
||||
Many alternatives have been proposed. Most are hacks that save some typing but
|
||||
use arbitrary or cryptic syntax or keywords, and fail the simple criterion for
|
||||
language change proposals: it should intuitively suggest the proper meaning to a
|
||||
human reader who has not yet been introduced to the construct.
|
||||
|
||||
An interesting phenomenon is that most experienced Python programmers recognize
|
||||
the ``while True`` idiom and don't seem to be missing the assignment in
|
||||
expression construct much; it's only newcomers who express a strong desire to
|
||||
add this to the language.
|
||||
|
||||
There's an alternative way of spelling this that seems attractive but is
|
||||
generally less robust than the "while True" solution::
|
||||
|
||||
line = f.readline()
|
||||
while line:
|
||||
... # do something with line...
|
||||
line = f.readline()
|
||||
|
||||
The problem with this is that if you change your mind about exactly how you get
|
||||
the next line (e.g. you want to change it into ``sys.stdin.readline()``) you
|
||||
have to remember to change two places in your program -- the second occurrence
|
||||
is hidden at the bottom of the loop.
|
||||
|
||||
The best approach is to use iterators, making it possible to loop through
|
||||
objects using the ``for`` statement. For example, :term:`file objects
|
||||
<file object>` support the iterator protocol, so you can write simply::
|
||||
|
||||
for line in f:
|
||||
... # do something with line...
|
||||
|
||||
|
||||
|
||||
Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?
|
||||
----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
As Guido said:
|
||||
|
||||
(a) For some operations, prefix notation just reads better than
|
||||
postfix -- prefix (and infix!) operations have a long tradition in
|
||||
mathematics which likes notations where the visuals help the
|
||||
mathematician thinking about a problem. Compare the easy with which we
|
||||
rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of
|
||||
doing the same thing using a raw OO notation.
|
||||
|
||||
(b) When I read code that says len(x) I *know* that it is asking for
|
||||
the length of something. This tells me two things: the result is an
|
||||
integer, and the argument is some kind of container. To the contrary,
|
||||
when I read x.len(), I have to already know that x is some kind of
|
||||
container implementing an interface or inheriting from a class that
|
||||
has a standard len(). Witness the confusion we occasionally have when
|
||||
a class that is not implementing a mapping has a get() or keys()
|
||||
method, or something that isn't a file has a write() method.
|
||||
|
||||
-- https://mail.python.org/pipermail/python-3000/2006-November/004643.html
|
||||
|
||||
|
||||
Why is join() a string method instead of a list or tuple method?
|
||||
----------------------------------------------------------------
|
||||
|
||||
Strings became much more like other standard types starting in Python 1.6, when
|
||||
methods were added which give the same functionality that has always been
|
||||
available using the functions of the string module. Most of these new methods
|
||||
have been widely accepted, but the one which appears to make some programmers
|
||||
feel uncomfortable is::
|
||||
|
||||
", ".join(['1', '2', '4', '8', '16'])
|
||||
|
||||
which gives the result::
|
||||
|
||||
"1, 2, 4, 8, 16"
|
||||
|
||||
There are two common arguments against this usage.
|
||||
|
||||
The first runs along the lines of: "It looks really ugly using a method of a
|
||||
string literal (string constant)", to which the answer is that it might, but a
|
||||
string literal is just a fixed value. If the methods are to be allowed on names
|
||||
bound to strings there is no logical reason to make them unavailable on
|
||||
literals.
|
||||
|
||||
The second objection is typically cast as: "I am really telling a sequence to
|
||||
join its members together with a string constant". Sadly, you aren't. For some
|
||||
reason there seems to be much less difficulty with having :meth:`~str.split` as
|
||||
a string method, since in that case it is easy to see that ::
|
||||
|
||||
"1, 2, 4, 8, 16".split(", ")
|
||||
|
||||
is an instruction to a string literal to return the substrings delimited by the
|
||||
given separator (or, by default, arbitrary runs of white space).
|
||||
|
||||
:meth:`~str.join` is a string method because in using it you are telling the
|
||||
separator string to iterate over a sequence of strings and insert itself between
|
||||
adjacent elements. This method can be used with any argument which obeys the
|
||||
rules for sequence objects, including any new classes you might define yourself.
|
||||
Similar methods exist for bytes and bytearray objects.
|
||||
|
||||
|
||||
How fast are exceptions?
|
||||
------------------------
|
||||
|
||||
A try/except block is extremely efficient if no exceptions are raised. Actually
|
||||
catching an exception is expensive. In versions of Python prior to 2.0 it was
|
||||
common to use this idiom::
|
||||
|
||||
try:
|
||||
value = mydict[key]
|
||||
except KeyError:
|
||||
mydict[key] = getvalue(key)
|
||||
value = mydict[key]
|
||||
|
||||
This only made sense when you expected the dict to have the key almost all the
|
||||
time. If that wasn't the case, you coded it like this::
|
||||
|
||||
if key in mydict:
|
||||
value = mydict[key]
|
||||
else:
|
||||
value = mydict[key] = getvalue(key)
|
||||
|
||||
For this specific case, you could also use ``value = dict.setdefault(key,
|
||||
getvalue(key))``, but only if the ``getvalue()`` call is cheap enough because it
|
||||
is evaluated in all cases.
|
||||
|
||||
|
||||
Why isn't there a switch or case statement in Python?
|
||||
-----------------------------------------------------
|
||||
|
||||
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. See :pep:`275` for
|
||||
complete details and the current status.
|
||||
|
||||
For cases where you need to choose from a very large number of possibilities,
|
||||
you can create a dictionary mapping case values to functions to call. For
|
||||
example::
|
||||
|
||||
def function_1(...):
|
||||
...
|
||||
|
||||
functions = {'a': function_1,
|
||||
'b': function_2,
|
||||
'c': self.method_1, ...}
|
||||
|
||||
func = functions[value]
|
||||
func()
|
||||
|
||||
For calling methods on objects, you can simplify yet further by using the
|
||||
:func:`getattr` built-in to retrieve methods with a particular name::
|
||||
|
||||
def visit_a(self, ...):
|
||||
...
|
||||
...
|
||||
|
||||
def dispatch(self, value):
|
||||
method_name = 'visit_' + str(value)
|
||||
method = getattr(self, method_name)
|
||||
method()
|
||||
|
||||
It's suggested that you use a prefix for the method names, such as ``visit_`` in
|
||||
this example. Without such a prefix, if values are coming from an untrusted
|
||||
source, an attacker would be able to call any method on your object.
|
||||
|
||||
|
||||
Can't you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?
|
||||
--------------------------------------------------------------------------------------------------------
|
||||
|
||||
Answer 1: 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.
|
||||
|
||||
Answer 2: Fortunately, there is `Stackless Python <https://github.com/stackless-dev/stackless/wiki>`_,
|
||||
which has a completely redesigned interpreter loop that avoids the C stack.
|
||||
|
||||
|
||||
Why can't lambda expressions contain statements?
|
||||
------------------------------------------------
|
||||
|
||||
Python lambda expressions 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 instead of a
|
||||
locally-defined function is that you don't need 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 expression yields) is assigned!
|
||||
|
||||
|
||||
Can Python be compiled to machine code, C or some other language?
|
||||
-----------------------------------------------------------------
|
||||
|
||||
`Cython <http://cython.org/>`_ compiles a modified version of Python with
|
||||
optional annotations into C extensions. `Nuitka <http://www.nuitka.net/>`_ is
|
||||
an up-and-coming compiler of Python into C++ code, aiming to support the full
|
||||
Python language. For compiling to Java you can consider
|
||||
`VOC <https://voc.readthedocs.io>`_.
|
||||
|
||||
|
||||
How does Python manage memory?
|
||||
------------------------------
|
||||
|
||||
The details of Python memory management depend on the implementation. The
|
||||
standard implementation of Python, :term:`CPython`, uses reference counting to
|
||||
detect inaccessible objects, and another mechanism to collect reference cycles,
|
||||
periodically executing a cycle detection algorithm which looks for inaccessible
|
||||
cycles and deletes the objects involved. The :mod:`gc` module provides functions
|
||||
to perform a garbage collection, obtain debugging statistics, and tune the
|
||||
collector's parameters.
|
||||
|
||||
Other implementations (such as `Jython <http://www.jython.org>`_ or
|
||||
`PyPy <http://www.pypy.org>`_), however, can rely on a different mechanism
|
||||
such as a full-blown garbage collector. This difference can cause some
|
||||
subtle porting problems if your Python code depends on the behavior of the
|
||||
reference counting implementation.
|
||||
|
||||
In some Python implementations, the following code (which is fine in CPython)
|
||||
will probably run out of file descriptors::
|
||||
|
||||
for file in very_long_list_of_files:
|
||||
f = open(file)
|
||||
c = f.read(1)
|
||||
|
||||
Indeed, using CPython's reference counting and destructor scheme, each new
|
||||
assignment to *f* closes the previous file. With a traditional GC, however,
|
||||
those file objects will only get collected (and closed) at varying and possibly
|
||||
long intervals.
|
||||
|
||||
If you want to write code that will work with any Python implementation,
|
||||
you should explicitly close the file or use the :keyword:`with` statement;
|
||||
this will work regardless of memory management scheme::
|
||||
|
||||
for file in very_long_list_of_files:
|
||||
with open(file) as f:
|
||||
c = f.read(1)
|
||||
|
||||
|
||||
Why doesn't CPython use a more traditional garbage collection scheme?
|
||||
---------------------------------------------------------------------
|
||||
|
||||
For one thing, this is not a C standard feature and hence it's not portable.
|
||||
(Yes, we know about the Boehm GC library. It has bits of assembler code for
|
||||
*most* common platforms, not for all of them, and although it is mostly
|
||||
transparent, it isn't completely transparent; patches are required to get
|
||||
Python to work with it.)
|
||||
|
||||
Traditional GC also becomes a problem when Python is embedded into other
|
||||
applications. While in a standalone Python it's 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, CPython works with anything that
|
||||
implements malloc() and free() properly.
|
||||
|
||||
|
||||
Why isn't all memory freed when CPython exits?
|
||||
----------------------------------------------
|
||||
|
||||
Objects referenced from the global namespaces of Python modules are not always
|
||||
deallocated when Python exits. This may happen if there are circular
|
||||
references. There are also certain bits of memory that are allocated by the C
|
||||
library that are impossible to free (e.g. a tool like Purify will complain about
|
||||
these). Python is, however, aggressive about cleaning up memory on exit and
|
||||
does try to destroy every single object.
|
||||
|
||||
If you want to force Python to delete certain things on deallocation use the
|
||||
:mod:`atexit` module to run a function that will force those deletions.
|
||||
|
||||
|
||||
Why are there separate tuple and list data types?
|
||||
-------------------------------------------------
|
||||
|
||||
Lists and tuples, while similar in many respects, are generally used in
|
||||
fundamentally different ways. Tuples can be thought of as being similar to
|
||||
Pascal records or C structs; they're small collections of related data which may
|
||||
be of different types which are operated on as a group. For example, a
|
||||
Cartesian coordinate is appropriately represented as a tuple of two or three
|
||||
numbers.
|
||||
|
||||
Lists, on the other hand, are more like arrays in other languages. They tend to
|
||||
hold a varying number of objects all of which have the same type and which are
|
||||
operated on one-by-one. For example, ``os.listdir('.')`` returns a list of
|
||||
strings representing the files in the current directory. Functions which
|
||||
operate on this output would generally not break if you added another file or
|
||||
two to the directory.
|
||||
|
||||
Tuples are immutable, meaning that once a tuple has been created, you can't
|
||||
replace any of its elements with a new value. Lists are mutable, meaning that
|
||||
you can always change a list's elements. Only immutable elements can be used as
|
||||
dictionary keys, and hence only tuples and not lists can be used as keys.
|
||||
|
||||
|
||||
How are lists implemented in CPython?
|
||||
-------------------------------------
|
||||
|
||||
CPython's lists are really variable-length arrays, not Lisp-style linked lists.
|
||||
The implementation uses a contiguous array of references to other objects, and
|
||||
keeps a pointer to this array and the array's length in a list head structure.
|
||||
|
||||
This makes indexing a list ``a[i]`` an operation whose cost is independent of
|
||||
the size of the list or the value of the index.
|
||||
|
||||
When items are appended or inserted, the array of references is resized. Some
|
||||
cleverness is applied to improve the performance of appending items repeatedly;
|
||||
when the array must be grown, some extra space is allocated so the next few
|
||||
times don't require an actual resize.
|
||||
|
||||
|
||||
How are dictionaries implemented in CPython?
|
||||
--------------------------------------------
|
||||
|
||||
CPython's dictionaries are implemented as resizable hash tables. Compared to
|
||||
B-trees, this gives better performance for lookup (the most common operation by
|
||||
far) under most circumstances, and the implementation is simpler.
|
||||
|
||||
Dictionaries work by computing a hash code for each key stored in the dictionary
|
||||
using the :func:`hash` built-in function. The hash code varies widely depending
|
||||
on the key and a per-process seed; for example, "Python" could hash to
|
||||
-539294296 while "python", a string that differs by a single bit, could hash
|
||||
to 1142331976. The hash code is then used to calculate a location in an
|
||||
internal array where the value will be stored. Assuming that you're storing
|
||||
keys that all have different hash values, this means that dictionaries take
|
||||
constant time -- O(1), in Big-O notation -- to retrieve a key.
|
||||
|
||||
|
||||
Why must dictionary keys be immutable?
|
||||
--------------------------------------
|
||||
|
||||
The hash table implementation of dictionaries uses a hash value calculated from
|
||||
the key value to find the key. If the key were a mutable object, its value
|
||||
could change, and thus its hash could also change. But since whoever changes
|
||||
the key object can't tell that it was being used as a dictionary key, it can't
|
||||
move the entry around in the dictionary. Then, when you try to look up the same
|
||||
object in the dictionary it won't be found because its hash value is different.
|
||||
If you tried to look up the old value it wouldn't be found either, because the
|
||||
value of the object found in that hash bin would be different.
|
||||
|
||||
If you want a dictionary indexed with a list, simply convert the list to a tuple
|
||||
first; the function ``tuple(L)`` creates a tuple with the same entries as the
|
||||
list ``L``. Tuples are immutable and can therefore be used as dictionary keys.
|
||||
|
||||
Some unacceptable solutions that have been proposed:
|
||||
|
||||
- Hash lists by their address (object ID). This doesn't work because if you
|
||||
construct a new list with the same value it won't be found; e.g.::
|
||||
|
||||
mydict = {[1, 2]: '12'}
|
||||
print(mydict[[1, 2]])
|
||||
|
||||
would raise a :exc:`KeyError` exception because the id of the ``[1, 2]`` used in the
|
||||
second line differs from that in the first line. In other words, dictionary
|
||||
keys should be compared using ``==``, not using :keyword:`is`.
|
||||
|
||||
- Make a copy when using a list as a key. This doesn't work because the list,
|
||||
being a mutable object, could contain a reference to itself, and then the
|
||||
copying code would run into an infinite loop.
|
||||
|
||||
- Allow lists as keys but tell the user not to modify them. This would allow a
|
||||
class of hard-to-track bugs in programs when you forgot or modified a list by
|
||||
accident. It also invalidates an important invariant of dictionaries: every
|
||||
value in ``d.keys()`` is usable as a key of the dictionary.
|
||||
|
||||
- Mark lists as read-only once they are used as a dictionary key. The problem
|
||||
is that it's not just the top-level object that could change its value; you
|
||||
could use a tuple containing a list as a key. Entering anything as a key into
|
||||
a dictionary would require marking all objects reachable from there as
|
||||
read-only -- and again, self-referential objects could cause an infinite loop.
|
||||
|
||||
There is a trick to get around this if you need to, but use it at your own risk:
|
||||
You can wrap a mutable structure inside a class instance which has both a
|
||||
:meth:`__eq__` and a :meth:`__hash__` method. You must then make sure that the
|
||||
hash value for all such wrapper objects that reside in a dictionary (or other
|
||||
hash based structure), remain fixed while the object is in the dictionary (or
|
||||
other structure). ::
|
||||
|
||||
class ListWrapper:
|
||||
def __init__(self, the_list):
|
||||
self.the_list = the_list
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.the_list == other.the_list
|
||||
|
||||
def __hash__(self):
|
||||
l = self.the_list
|
||||
result = 98767 - len(l)*555
|
||||
for i, el in enumerate(l):
|
||||
try:
|
||||
result = result + (hash(el) % 9999999) * 1001 + i
|
||||
except Exception:
|
||||
result = (result % 7777777) + i * 333
|
||||
return result
|
||||
|
||||
Note that the hash computation is complicated by the possibility that some
|
||||
members of the list may be unhashable and also by the possibility of arithmetic
|
||||
overflow.
|
||||
|
||||
Furthermore it must always be the case that if ``o1 == o2`` (ie ``o1.__eq__(o2)
|
||||
is True``) then ``hash(o1) == hash(o2)`` (ie, ``o1.__hash__() == o2.__hash__()``),
|
||||
regardless of whether the object is in a dictionary or not. If you fail to meet
|
||||
these restrictions dictionaries and other hash based structures will misbehave.
|
||||
|
||||
In the case of ListWrapper, whenever the wrapper object is in a dictionary the
|
||||
wrapped list must not change to avoid anomalies. Don't do this unless you are
|
||||
prepared to think hard about the requirements and the consequences of not
|
||||
meeting them correctly. Consider yourself warned.
|
||||
|
||||
|
||||
Why doesn't list.sort() return the sorted list?
|
||||
-----------------------------------------------
|
||||
|
||||
In situations where performance matters, making a copy of the list just to sort
|
||||
it would be wasteful. Therefore, :meth:`list.sort` sorts the list in place. In
|
||||
order to remind you of that fact, it does not return the sorted list. This way,
|
||||
you won't be fooled into accidentally overwriting a list when you need a sorted
|
||||
copy but also need to keep the unsorted version around.
|
||||
|
||||
If you want to return a new list, use the built-in :func:`sorted` function
|
||||
instead. This function creates a new list from a provided iterable, sorts
|
||||
it and returns it. For example, here's how to iterate over the keys of a
|
||||
dictionary in sorted order::
|
||||
|
||||
for key in sorted(mydict):
|
||||
... # do whatever with mydict[key]...
|
||||
|
||||
|
||||
How do you specify and enforce an interface spec in Python?
|
||||
-----------------------------------------------------------
|
||||
|
||||
An interface specification for a module as provided by languages such as C++ and
|
||||
Java describes the prototypes for the methods and functions of the module. Many
|
||||
feel that compile-time enforcement of interface specifications helps in the
|
||||
construction of large programs.
|
||||
|
||||
Python 2.6 adds an :mod:`abc` module that lets you define Abstract Base Classes
|
||||
(ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check
|
||||
whether an instance or a class implements a particular ABC. The
|
||||
:mod:`collections.abc` module defines a set of useful ABCs such as
|
||||
:class:`~collections.abc.Iterable`, :class:`~collections.abc.Container`, and
|
||||
:class:`~collections.abc.MutableMapping`.
|
||||
|
||||
For Python, many of the advantages of interface specifications can be obtained
|
||||
by an appropriate test discipline for components. There is also a tool,
|
||||
PyChecker, which can be used to find problems due to subclassing.
|
||||
|
||||
A good test suite for a module can both provide a regression test and serve as a
|
||||
module interface specification and a set of examples. Many Python modules can
|
||||
be run as a script to provide a simple "self test." Even modules which use
|
||||
complex external interfaces can often be tested in isolation using trivial
|
||||
"stub" emulations of the external interface. The :mod:`doctest` and
|
||||
:mod:`unittest` modules or third-party test frameworks can be used to construct
|
||||
exhaustive test suites that exercise every line of code in a module.
|
||||
|
||||
An appropriate testing discipline can help build large complex applications in
|
||||
Python as well as having interface specifications would. In fact, it can be
|
||||
better because an interface specification cannot test certain properties of a
|
||||
program. For example, the :meth:`append` method is expected to add new elements
|
||||
to the end of some internal list; an interface specification cannot test that
|
||||
your :meth:`append` implementation will actually do this correctly, but it's
|
||||
trivial to check this property in a test suite.
|
||||
|
||||
Writing test suites is very helpful, and you might want to design your code with
|
||||
an eye to making it easily tested. One increasingly popular technique,
|
||||
test-directed development, calls for writing parts of the test suite first,
|
||||
before you write any of the actual code. Of course Python allows you to be
|
||||
sloppy and not write test cases at all.
|
||||
|
||||
|
||||
Why is there no goto?
|
||||
---------------------
|
||||
|
||||
You can use exceptions to provide a "structured goto" that even works across
|
||||
function calls. Many feel that exceptions can conveniently emulate all
|
||||
reasonable uses of the "go" or "goto" constructs of C, Fortran, and other
|
||||
languages. For example::
|
||||
|
||||
class label(Exception): pass # declare a label
|
||||
|
||||
try:
|
||||
...
|
||||
if condition: raise label() # goto label
|
||||
...
|
||||
except label: # where to goto
|
||||
pass
|
||||
...
|
||||
|
||||
This doesn't allow you to jump into the middle of a loop, but that's usually
|
||||
considered an abuse of goto anyway. Use sparingly.
|
||||
|
||||
|
||||
Why can't raw strings (r-strings) end with a backslash?
|
||||
-------------------------------------------------------
|
||||
|
||||
More precisely, they can't end with an odd number of backslashes: the unpaired
|
||||
backslash at the end escapes the closing quote character, leaving an
|
||||
unterminated string.
|
||||
|
||||
Raw strings were designed to ease creating input for processors (chiefly regular
|
||||
expression engines) that want to do their own backslash escape processing. Such
|
||||
processors consider an unmatched trailing backslash to be an error anyway, so
|
||||
raw strings disallow that. In return, they allow you to pass on the string
|
||||
quote character by escaping it with a backslash. These rules work well when
|
||||
r-strings are used for their intended purpose.
|
||||
|
||||
If you're trying to build Windows pathnames, note that all Windows system calls
|
||||
accept forward slashes too::
|
||||
|
||||
f = open("/mydir/file.txt") # works fine!
|
||||
|
||||
If you're trying to build a pathname for a DOS command, try e.g. one of ::
|
||||
|
||||
dir = r"\this\is\my\dos\dir" "\\"
|
||||
dir = r"\this\is\my\dos\dir\ "[:-1]
|
||||
dir = "\\this\\is\\my\\dos\\dir\\"
|
||||
|
||||
|
||||
Why doesn't Python have a "with" statement for attribute assignments?
|
||||
---------------------------------------------------------------------
|
||||
|
||||
Python has a 'with' statement that wraps the execution of a block, calling code
|
||||
on the entrance and exit from the block. Some language have a construct that
|
||||
looks like this::
|
||||
|
||||
with obj:
|
||||
a = 1 # equivalent to obj.a = 1
|
||||
total = total + 1 # obj.total = obj.total + 1
|
||||
|
||||
In Python, such a construct would be ambiguous.
|
||||
|
||||
Other languages, such as Object Pascal, Delphi, and C++, use static types, so
|
||||
it's possible to know, in an unambiguous way, what member is being assigned
|
||||
to. This is the main point of static typing -- the compiler *always* knows the
|
||||
scope of every variable at compile time.
|
||||
|
||||
Python uses dynamic types. It is impossible to know in advance which attribute
|
||||
will be referenced at runtime. Member attributes may be added or removed from
|
||||
objects on the fly. This makes it impossible to know, from a simple reading,
|
||||
what attribute is being referenced: a local one, a global one, or a member
|
||||
attribute?
|
||||
|
||||
For instance, take the following incomplete snippet::
|
||||
|
||||
def foo(a):
|
||||
with a:
|
||||
print(x)
|
||||
|
||||
The snippet assumes that "a" must have a member attribute called "x". However,
|
||||
there is nothing in Python that tells the interpreter this. What should happen
|
||||
if "a" is, let us say, an integer? If there is a global variable named "x",
|
||||
will it be used inside the with block? As you see, the dynamic nature of Python
|
||||
makes such choices much harder.
|
||||
|
||||
The primary benefit of "with" and similar language features (reduction of code
|
||||
volume) can, however, easily be achieved in Python by assignment. Instead of::
|
||||
|
||||
function(args).mydict[index][index].a = 21
|
||||
function(args).mydict[index][index].b = 42
|
||||
function(args).mydict[index][index].c = 63
|
||||
|
||||
write this::
|
||||
|
||||
ref = function(args).mydict[index][index]
|
||||
ref.a = 21
|
||||
ref.b = 42
|
||||
ref.c = 63
|
||||
|
||||
This also has the side-effect of increasing execution speed because name
|
||||
bindings are resolved at run-time in Python, and the second version only needs
|
||||
to perform the resolution once.
|
||||
|
||||
|
||||
Why are colons required for the if/while/def/class statements?
|
||||
--------------------------------------------------------------
|
||||
|
||||
The colon is required primarily to enhance readability (one of the results of
|
||||
the experimental ABC language). Consider this::
|
||||
|
||||
if a == b
|
||||
print(a)
|
||||
|
||||
versus ::
|
||||
|
||||
if a == b:
|
||||
print(a)
|
||||
|
||||
Notice how the second one is slightly easier to read. Notice further how a
|
||||
colon sets off the example in this FAQ answer; it's a standard usage in English.
|
||||
|
||||
Another minor reason is that the colon makes it easier for editors with syntax
|
||||
highlighting; they can look for colons to decide when indentation needs to be
|
||||
increased instead of having to do a more elaborate parsing of the program text.
|
||||
|
||||
|
||||
Why does Python allow commas at the end of lists and tuples?
|
||||
------------------------------------------------------------
|
||||
|
||||
Python lets you add a trailing comma at the end of lists, tuples, and
|
||||
dictionaries::
|
||||
|
||||
[1, 2, 3,]
|
||||
('a', 'b', 'c',)
|
||||
d = {
|
||||
"A": [1, 5],
|
||||
"B": [6, 7], # last trailing comma is optional but good style
|
||||
}
|
||||
|
||||
|
||||
There are several reasons to allow this.
|
||||
|
||||
When you have a literal value for a list, tuple, or dictionary spread across
|
||||
multiple lines, it's easier to add more elements because you don't have to
|
||||
remember to add a comma to the previous line. The lines can also be reordered
|
||||
without creating a syntax error.
|
||||
|
||||
Accidentally omitting the comma can lead to errors that are hard to diagnose.
|
||||
For example::
|
||||
|
||||
x = [
|
||||
"fee",
|
||||
"fie"
|
||||
"foo",
|
||||
"fum"
|
||||
]
|
||||
|
||||
This list looks like it has four elements, but it actually contains three:
|
||||
"fee", "fiefoo" and "fum". Always adding the comma avoids this source of error.
|
||||
|
||||
Allowing the trailing comma may also make programmatic code generation easier.
|
447
python-3.7.4-docs-html/_sources/faq/extending.rst.txt
Normal file
447
python-3.7.4-docs-html/_sources/faq/extending.rst.txt
Normal file
@@ -0,0 +1,447 @@
|
||||
=======================
|
||||
Extending/Embedding FAQ
|
||||
=======================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
.. highlight:: c
|
||||
|
||||
|
||||
.. XXX need review for Python 3.
|
||||
|
||||
|
||||
Can I create my own functions in C?
|
||||
-----------------------------------
|
||||
|
||||
Yes, you can create built-in modules containing functions, variables, exceptions
|
||||
and even new types in C. This is explained in the document
|
||||
:ref:`extending-index`.
|
||||
|
||||
Most intermediate or advanced Python books will also cover this topic.
|
||||
|
||||
|
||||
Can I create my own functions in C++?
|
||||
-------------------------------------
|
||||
|
||||
Yes, using the C compatibility features found in C++. 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.
|
||||
|
||||
|
||||
.. _c-wrapper-software:
|
||||
|
||||
Writing C is hard; are there any alternatives?
|
||||
----------------------------------------------
|
||||
|
||||
There are a number of alternatives to writing your own C extensions, depending
|
||||
on what you're trying to do.
|
||||
|
||||
.. XXX make sure these all work
|
||||
|
||||
`Cython <http://cython.org>`_ and its relative `Pyrex
|
||||
<https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/>`_ are compilers
|
||||
that accept a slightly modified form of Python and generate the corresponding
|
||||
C code. Cython and Pyrex make it possible to write an extension without having
|
||||
to learn Python's C API.
|
||||
|
||||
If you need to interface to some C or C++ library for which no Python extension
|
||||
currently exists, you can try wrapping the library's data types and functions
|
||||
with a tool such as `SWIG <http://www.swig.org>`_. `SIP
|
||||
<https://riverbankcomputing.com/software/sip/intro>`__, `CXX
|
||||
<http://cxx.sourceforge.net/>`_ `Boost
|
||||
<http://www.boost.org/libs/python/doc/index.html>`_, or `Weave
|
||||
<https://github.com/scipy/weave>`_ are also
|
||||
alternatives for wrapping C++ libraries.
|
||||
|
||||
|
||||
How can I execute arbitrary Python statements from C?
|
||||
-----------------------------------------------------
|
||||
|
||||
The highest-level function to do this is :c:func:`PyRun_SimpleString` which takes
|
||||
a single string argument to be executed in the context of the module
|
||||
``__main__`` and returns ``0`` for success and ``-1`` when an exception occurred
|
||||
(including :exc:`SyntaxError`). If you want more control, use
|
||||
:c:func:`PyRun_String`; see the source for :c:func:`PyRun_SimpleString` in
|
||||
``Python/pythonrun.c``.
|
||||
|
||||
|
||||
How can I evaluate an arbitrary Python expression from C?
|
||||
---------------------------------------------------------
|
||||
|
||||
Call the function :c:func:`PyRun_String` from the previous question with the
|
||||
start symbol :c:data:`Py_eval_input`; it parses an expression, evaluates it and
|
||||
returns its value.
|
||||
|
||||
|
||||
How do I extract C values from a Python object?
|
||||
-----------------------------------------------
|
||||
|
||||
That depends on the object's type. If it's a tuple, :c:func:`PyTuple_Size`
|
||||
returns its length and :c:func:`PyTuple_GetItem` returns the item at a specified
|
||||
index. Lists have similar functions, :c:func:`PyListSize` and
|
||||
:c:func:`PyList_GetItem`.
|
||||
|
||||
For bytes, :c:func:`PyBytes_Size` returns its length and
|
||||
:c:func:`PyBytes_AsStringAndSize` provides a pointer to its value and its
|
||||
length. Note that Python bytes objects may contain null bytes so C's
|
||||
:c:func:`strlen` should not be used.
|
||||
|
||||
To test the type of an object, first make sure it isn't *NULL*, and then use
|
||||
:c:func:`PyBytes_Check`, :c:func:`PyTuple_Check`, :c:func:`PyList_Check`, etc.
|
||||
|
||||
There is also a high-level API to Python objects which is provided by the
|
||||
so-called 'abstract' interface -- read ``Include/abstract.h`` for further
|
||||
details. It allows interfacing with any kind of Python sequence using calls
|
||||
like :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem`, etc. as well
|
||||
as many other useful protocols such as numbers (:c:func:`PyNumber_Index` et
|
||||
al.) and mappings in the PyMapping APIs.
|
||||
|
||||
|
||||
How do I use Py_BuildValue() to create a tuple of arbitrary length?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
You can't. Use :c:func:`PyTuple_Pack` instead.
|
||||
|
||||
|
||||
How do I call an object's method from C?
|
||||
----------------------------------------
|
||||
|
||||
The :c:func:`PyObject_CallMethod` function can be used to call an arbitrary
|
||||
method of an object. The parameters are the object, the name of the method to
|
||||
call, a format string like that used with :c:func:`Py_BuildValue`, and the
|
||||
argument values::
|
||||
|
||||
PyObject *
|
||||
PyObject_CallMethod(PyObject *object, const char *method_name,
|
||||
const char *arg_format, ...);
|
||||
|
||||
This works for any object that has methods -- whether built-in or user-defined.
|
||||
You are responsible for eventually :c:func:`Py_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 = PyObject_CallMethod(f, "seek", "(ii)", 10, 0);
|
||||
if (res == NULL) {
|
||||
... an exception occurred ...
|
||||
}
|
||||
else {
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
Note that since :c:func:`PyObject_CallObject` *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)".
|
||||
|
||||
|
||||
How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?
|
||||
----------------------------------------------------------------------------------------
|
||||
|
||||
In Python code, define an object that supports the ``write()`` method. Assign
|
||||
this object to :data:`sys.stdout` and :data:`sys.stderr`. Call print_error, or
|
||||
just allow the standard traceback mechanism to work. Then, the output will go
|
||||
wherever your ``write()`` method sends it.
|
||||
|
||||
The easiest way to do this is to use the :class:`io.StringIO` class:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import io, sys
|
||||
>>> sys.stdout = io.StringIO()
|
||||
>>> print('foo')
|
||||
>>> print('hello world!')
|
||||
>>> sys.stderr.write(sys.stdout.getvalue())
|
||||
foo
|
||||
hello world!
|
||||
|
||||
A custom object to do the same would look like this:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import io, sys
|
||||
>>> class StdoutCatcher(io.TextIOBase):
|
||||
... def __init__(self):
|
||||
... self.data = []
|
||||
... def write(self, stuff):
|
||||
... self.data.append(stuff)
|
||||
...
|
||||
>>> import sys
|
||||
>>> sys.stdout = StdoutCatcher()
|
||||
>>> print('foo')
|
||||
>>> print('hello world!')
|
||||
>>> sys.stderr.write(''.join(sys.stdout.data))
|
||||
foo
|
||||
hello world!
|
||||
|
||||
|
||||
How do I access a module written in Python from C?
|
||||
--------------------------------------------------
|
||||
|
||||
You can get a pointer to the module object as follows::
|
||||
|
||||
module = PyImport_ImportModule("<modulename>");
|
||||
|
||||
If the module hasn't been imported yet (i.e. it is not yet present in
|
||||
:data:`sys.modules`), this initializes the module; otherwise it simply returns
|
||||
the value of ``sys.modules["<modulename>"]``. Note that it doesn't enter the
|
||||
module into any namespace -- it only ensures it has been initialized and is
|
||||
stored in :data:`sys.modules`.
|
||||
|
||||
You can then access the module's attributes (i.e. any name defined in the
|
||||
module) as follows::
|
||||
|
||||
attr = PyObject_GetAttrString(module, "<attrname>");
|
||||
|
||||
Calling :c:func:`PyObject_SetAttrString` to assign to variables in the module
|
||||
also works.
|
||||
|
||||
|
||||
How do I interface to C++ objects from Python?
|
||||
----------------------------------------------
|
||||
|
||||
Depending on your requirements, there are many approaches. To do this manually,
|
||||
begin by reading :ref:`the "Extending and Embedding" document
|
||||
<extending-index>`. Realize that for the Python run-time system, there isn't a
|
||||
whole lot of difference between C and C++ -- so the strategy of building a new
|
||||
Python type around a C structure (pointer) type will also work for C++ objects.
|
||||
|
||||
For C++ libraries, see :ref:`c-wrapper-software`.
|
||||
|
||||
|
||||
I added a module using the Setup file and the make fails; why?
|
||||
--------------------------------------------------------------
|
||||
|
||||
Setup must end in a newline, if there is no newline there, the build process
|
||||
fails. (Fixing this requires some ugly shell script hackery, and this bug is so
|
||||
minor that it doesn't seem worth the effort.)
|
||||
|
||||
|
||||
How do I debug an extension?
|
||||
----------------------------
|
||||
|
||||
When using GDB with dynamically loaded extensions, you can't set a breakpoint in
|
||||
your extension until your extension is loaded.
|
||||
|
||||
In your ``.gdbinit`` file (or interactively), add the command:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
br _PyImport_LoadDynamicModule
|
||||
|
||||
Then, when you run GDB:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ gdb /local/bin/python
|
||||
gdb) run myscript.py
|
||||
gdb) continue # repeat until your extension is loaded
|
||||
gdb) finish # so that your extension is loaded
|
||||
gdb) br myfunction.c:50
|
||||
gdb) continue
|
||||
|
||||
I want to compile a Python module on my Linux system, but some files are missing. Why?
|
||||
--------------------------------------------------------------------------------------
|
||||
|
||||
Most packaged versions of Python don't include the
|
||||
:file:`/usr/lib/python2.{x}/config/` directory, which contains various files
|
||||
required for compiling Python extensions.
|
||||
|
||||
For Red Hat, install the python-devel RPM to get the necessary files.
|
||||
|
||||
For Debian, run ``apt-get install python-dev``.
|
||||
|
||||
|
||||
How do I tell "incomplete input" from "invalid input"?
|
||||
------------------------------------------------------
|
||||
|
||||
Sometimes you want to emulate the Python interactive interpreter's behavior,
|
||||
where it gives you a continuation prompt when the input is incomplete (e.g. you
|
||||
typed the start of an "if" statement or you didn't close your parentheses or
|
||||
triple string quotes), but it gives you a syntax error message immediately when
|
||||
the input is invalid.
|
||||
|
||||
In Python you can use the :mod:`codeop` module, which approximates the parser's
|
||||
behavior sufficiently. IDLE uses this, for example.
|
||||
|
||||
The easiest way to do it in C is to call :c:func:`PyRun_InteractiveLoop` (perhaps
|
||||
in a separate thread) and let the Python interpreter handle the input for
|
||||
you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` to point at your
|
||||
custom input function. See ``Modules/readline.c`` and ``Parser/myreadline.c``
|
||||
for more hints.
|
||||
|
||||
However sometimes you have to run the embedded Python interpreter in the same
|
||||
thread as your rest application and you can't allow the
|
||||
:c:func:`PyRun_InteractiveLoop` to stop while waiting for user input. The one
|
||||
solution then is to call :c:func:`PyParser_ParseString` and test for ``e.error``
|
||||
equal to ``E_EOF``, which means the input is incomplete. Here's a sample code
|
||||
fragment, untested, inspired by code from Alex Farber::
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include <node.h>
|
||||
#include <errcode.h>
|
||||
#include <grammar.h>
|
||||
#include <parsetok.h>
|
||||
#include <compile.h>
|
||||
|
||||
int testcomplete(char *code)
|
||||
/* code should end in \n */
|
||||
/* return -1 for error, 0 for incomplete, 1 for complete */
|
||||
{
|
||||
node *n;
|
||||
perrdetail e;
|
||||
|
||||
n = PyParser_ParseString(code, &_PyParser_Grammar,
|
||||
Py_file_input, &e);
|
||||
if (n == NULL) {
|
||||
if (e.error == E_EOF)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
PyNode_Free(n);
|
||||
return 1;
|
||||
}
|
||||
|
||||
Another solution is trying to compile the received string with
|
||||
:c:func:`Py_CompileString`. If it compiles without errors, try to execute the
|
||||
returned code object by calling :c:func:`PyEval_EvalCode`. Otherwise save the
|
||||
input for later. If the compilation fails, find out if it's an error or just
|
||||
more input is required - by extracting the message string from the exception
|
||||
tuple and comparing it to the string "unexpected EOF while parsing". Here is a
|
||||
complete example using the GNU readline library (you may want to ignore
|
||||
**SIGINT** while calling readline())::
|
||||
|
||||
#include <stdio.h>
|
||||
#include <readline.h>
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include <object.h>
|
||||
#include <compile.h>
|
||||
#include <eval.h>
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
int i, j, done = 0; /* lengths of line, code */
|
||||
char ps1[] = ">>> ";
|
||||
char ps2[] = "... ";
|
||||
char *prompt = ps1;
|
||||
char *msg, *line, *code = NULL;
|
||||
PyObject *src, *glb, *loc;
|
||||
PyObject *exc, *val, *trb, *obj, *dum;
|
||||
|
||||
Py_Initialize ();
|
||||
loc = PyDict_New ();
|
||||
glb = PyDict_New ();
|
||||
PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ());
|
||||
|
||||
while (!done)
|
||||
{
|
||||
line = readline (prompt);
|
||||
|
||||
if (NULL == line) /* Ctrl-D pressed */
|
||||
{
|
||||
done = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = strlen (line);
|
||||
|
||||
if (i > 0)
|
||||
add_history (line); /* save non-empty lines */
|
||||
|
||||
if (NULL == code) /* nothing in code yet */
|
||||
j = 0;
|
||||
else
|
||||
j = strlen (code);
|
||||
|
||||
code = realloc (code, i + j + 2);
|
||||
if (NULL == code) /* out of memory */
|
||||
exit (1);
|
||||
|
||||
if (0 == j) /* code was empty, so */
|
||||
code[0] = '\0'; /* keep strncat happy */
|
||||
|
||||
strncat (code, line, i); /* append line to code */
|
||||
code[i + j] = '\n'; /* append '\n' to code */
|
||||
code[i + j + 1] = '\0';
|
||||
|
||||
src = Py_CompileString (code, "<stdin>", Py_single_input);
|
||||
|
||||
if (NULL != src) /* compiled just fine - */
|
||||
{
|
||||
if (ps1 == prompt || /* ">>> " or */
|
||||
'\n' == code[i + j - 1]) /* "... " and double '\n' */
|
||||
{ /* so execute it */
|
||||
dum = PyEval_EvalCode (src, glb, loc);
|
||||
Py_XDECREF (dum);
|
||||
Py_XDECREF (src);
|
||||
free (code);
|
||||
code = NULL;
|
||||
if (PyErr_Occurred ())
|
||||
PyErr_Print ();
|
||||
prompt = ps1;
|
||||
}
|
||||
} /* syntax error or E_EOF? */
|
||||
else if (PyErr_ExceptionMatches (PyExc_SyntaxError))
|
||||
{
|
||||
PyErr_Fetch (&exc, &val, &trb); /* clears exception! */
|
||||
|
||||
if (PyArg_ParseTuple (val, "sO", &msg, &obj) &&
|
||||
!strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */
|
||||
{
|
||||
Py_XDECREF (exc);
|
||||
Py_XDECREF (val);
|
||||
Py_XDECREF (trb);
|
||||
prompt = ps2;
|
||||
}
|
||||
else /* some other syntax error */
|
||||
{
|
||||
PyErr_Restore (exc, val, trb);
|
||||
PyErr_Print ();
|
||||
free (code);
|
||||
code = NULL;
|
||||
prompt = ps1;
|
||||
}
|
||||
}
|
||||
else /* some non-syntax error */
|
||||
{
|
||||
PyErr_Print ();
|
||||
free (code);
|
||||
code = NULL;
|
||||
prompt = ps1;
|
||||
}
|
||||
|
||||
free (line);
|
||||
}
|
||||
}
|
||||
|
||||
Py_XDECREF(glb);
|
||||
Py_XDECREF(loc);
|
||||
Py_Finalize();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
How do I find undefined g++ symbols __builtin_new or __pure_virtual?
|
||||
--------------------------------------------------------------------
|
||||
|
||||
To dynamically load g++ extension modules, you must recompile Python, relink it
|
||||
using g++ (change LINKCC in the Python Modules Makefile), and link your
|
||||
extension module using g++ (e.g., ``g++ -shared -o mymodule.so mymodule.o``).
|
||||
|
||||
|
||||
Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)?
|
||||
----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Yes, you can inherit from built-in classes such as :class:`int`, :class:`list`,
|
||||
:class:`dict`, etc.
|
||||
|
||||
The Boost Python Library (BPL, http://www.boost.org/libs/python/doc/index.html)
|
||||
provides a way of doing this from C++ (i.e. you can inherit from an extension
|
||||
class written in C++ using the BPL).
|
446
python-3.7.4-docs-html/_sources/faq/general.rst.txt
Normal file
446
python-3.7.4-docs-html/_sources/faq/general.rst.txt
Normal file
@@ -0,0 +1,446 @@
|
||||
:tocdepth: 2
|
||||
|
||||
==================
|
||||
General Python FAQ
|
||||
==================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
General Information
|
||||
===================
|
||||
|
||||
What is Python?
|
||||
---------------
|
||||
|
||||
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 Unix variants, on the Mac, and on
|
||||
Windows 2000 and later.
|
||||
|
||||
To find out more, start with :ref:`tutorial-index`. The `Beginner's Guide to
|
||||
Python <https://wiki.python.org/moin/BeginnersGuide>`_ links to other
|
||||
introductory tutorials and resources for learning Python.
|
||||
|
||||
|
||||
What is the Python Software Foundation?
|
||||
---------------------------------------
|
||||
|
||||
The Python Software Foundation is an independent non-profit organization that
|
||||
holds the copyright on Python versions 2.1 and newer. The PSF's mission is to
|
||||
advance open source technology related to the Python programming language and to
|
||||
publicize the use of Python. The PSF's home page is at
|
||||
https://www.python.org/psf/.
|
||||
|
||||
Donations to the PSF are tax-exempt in the US. If you use Python and find it
|
||||
helpful, please contribute via `the PSF donation page
|
||||
<https://www.python.org/psf/donations/>`_.
|
||||
|
||||
|
||||
Are there copyright restrictions on the use of Python?
|
||||
------------------------------------------------------
|
||||
|
||||
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. 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 (modified or
|
||||
unmodified), or to sell products that incorporate Python in some form. We would
|
||||
still like to know about all commercial use of Python, of course.
|
||||
|
||||
See `the PSF license page <https://www.python.org/psf/license/>`_ to find further
|
||||
explanations and a link to the full text of the license.
|
||||
|
||||
The Python logo is trademarked, and in certain cases permission is required to
|
||||
use it. Consult `the Trademark Usage Policy
|
||||
<https://www.python.org/psf/trademarks/>`__ for more information.
|
||||
|
||||
|
||||
Why was Python created in the first place?
|
||||
------------------------------------------
|
||||
|
||||
Here's a *very* brief summary of what started it all, written by Guido van
|
||||
Rossum:
|
||||
|
||||
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 Modula-3 report.
|
||||
Modula-3 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.
|
||||
|
||||
|
||||
What is Python good for?
|
||||
------------------------
|
||||
|
||||
Python is a high-level general-purpose programming language that can be applied
|
||||
to many different classes of problems.
|
||||
|
||||
The language comes with a large standard library that covers areas such as
|
||||
string processing (regular expressions, Unicode, calculating differences between
|
||||
files), Internet protocols (HTTP, FTP, SMTP, XML-RPC, POP, IMAP, CGI
|
||||
programming), software engineering (unit testing, logging, profiling, parsing
|
||||
Python code), and operating system interfaces (system calls, filesystems, TCP/IP
|
||||
sockets). Look at the table of contents for :ref:`library-index` to get an idea
|
||||
of what's available. A wide variety of third-party extensions are also
|
||||
available. Consult `the Python Package Index <https://pypi.org>`_ to
|
||||
find packages of interest to you.
|
||||
|
||||
|
||||
How does the Python version numbering scheme work?
|
||||
--------------------------------------------------
|
||||
|
||||
Python versions are numbered A.B.C or A.B. A is the major version number -- it
|
||||
is only incremented for really major changes in the language. B is the minor
|
||||
version number, incremented for less earth-shattering changes. C is the
|
||||
micro-level -- it is incremented for each bugfix release. See :pep:`6` for more
|
||||
information about bugfix releases.
|
||||
|
||||
Not all releases are bugfix releases. In the run-up to a new major release, a
|
||||
series of development releases are made, denoted as alpha, beta, or release
|
||||
candidate. Alphas are early releases in which interfaces aren't yet finalized;
|
||||
it's not unexpected to see an interface change between two alpha releases.
|
||||
Betas are more stable, preserving existing interfaces but possibly adding new
|
||||
modules, and release candidates are frozen, making no changes except as needed
|
||||
to fix critical bugs.
|
||||
|
||||
Alpha, beta and release candidate versions have an additional suffix. The
|
||||
suffix for an alpha version is "aN" for some small number N, the suffix for a
|
||||
beta version is "bN" for some small number N, and the suffix for a release
|
||||
candidate version is "cN" for some small number N. In other words, all versions
|
||||
labeled 2.0aN precede the versions labeled 2.0bN, which precede versions labeled
|
||||
2.0cN, and *those* precede 2.0.
|
||||
|
||||
You may also find version numbers with a "+" suffix, e.g. "2.2+". These are
|
||||
unreleased versions, built directly from the CPython development repository. In
|
||||
practice, after a final minor release is made, the version is incremented to the
|
||||
next minor version, which becomes the "a0" version, e.g. "2.4a0".
|
||||
|
||||
See also the documentation for :data:`sys.version`, :data:`sys.hexversion`, and
|
||||
:data:`sys.version_info`.
|
||||
|
||||
|
||||
How do I obtain a copy of the Python source?
|
||||
--------------------------------------------
|
||||
|
||||
The latest Python source distribution is always available from python.org, at
|
||||
https://www.python.org/downloads/. The latest development sources can be obtained
|
||||
at https://github.com/python/cpython/.
|
||||
|
||||
The source distribution is a gzipped tar file containing the complete C source,
|
||||
Sphinx-formatted documentation, Python library modules, example programs, and
|
||||
several useful pieces of freely distributable software. The source will compile
|
||||
and run out of the box on most UNIX platforms.
|
||||
|
||||
Consult the `Getting Started section of the Python Developer's Guide
|
||||
<https://devguide.python.org/setup/>`__ for more
|
||||
information on getting the source code and compiling it.
|
||||
|
||||
|
||||
How do I get documentation on Python?
|
||||
-------------------------------------
|
||||
|
||||
.. XXX mention py3k
|
||||
|
||||
The standard documentation for the current stable version of Python is available
|
||||
at https://docs.python.org/3/. PDF, plain text, and downloadable HTML versions are
|
||||
also available at https://docs.python.org/3/download.html.
|
||||
|
||||
The documentation is written in reStructuredText and processed by `the Sphinx
|
||||
documentation tool <http://sphinx-doc.org/>`__. The reStructuredText source for
|
||||
the documentation is part of the Python source distribution.
|
||||
|
||||
|
||||
I've never programmed before. Is there a Python tutorial?
|
||||
---------------------------------------------------------
|
||||
|
||||
There are numerous tutorials and books available. The standard documentation
|
||||
includes :ref:`tutorial-index`.
|
||||
|
||||
Consult `the Beginner's Guide <https://wiki.python.org/moin/BeginnersGuide>`_ to
|
||||
find information for beginning Python programmers, including lists of tutorials.
|
||||
|
||||
|
||||
Is there a newsgroup or mailing list devoted to Python?
|
||||
-------------------------------------------------------
|
||||
|
||||
There is a newsgroup, :newsgroup:`comp.lang.python`, and a mailing list,
|
||||
`python-list <https://mail.python.org/mailman/listinfo/python-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.
|
||||
:newsgroup:`comp.lang.python` is high-traffic, receiving hundreds of postings
|
||||
every day, and Usenet readers are often more able to cope with this volume.
|
||||
|
||||
Announcements of new software releases and events can be found in
|
||||
comp.lang.python.announce, a low-traffic moderated list that receives about five
|
||||
postings per day. It's available as `the python-announce mailing list
|
||||
<https://mail.python.org/mailman/listinfo/python-announce-list>`_.
|
||||
|
||||
More info about other mailing lists and newsgroups
|
||||
can be found at https://www.python.org/community/lists/.
|
||||
|
||||
|
||||
How do I get a beta test version of Python?
|
||||
-------------------------------------------
|
||||
|
||||
Alpha and beta releases are available from https://www.python.org/downloads/. All
|
||||
releases are announced on the comp.lang.python and comp.lang.python.announce
|
||||
newsgroups and on the Python home page at https://www.python.org/; an RSS feed of
|
||||
news is available.
|
||||
|
||||
You can also access the development version of Python through Git. See
|
||||
`The Python Developer's Guide <https://devguide.python.org/>`_ for details.
|
||||
|
||||
|
||||
How do I submit bug reports and patches for Python?
|
||||
---------------------------------------------------
|
||||
|
||||
To report a bug or submit a patch, please use the Roundup installation at
|
||||
https://bugs.python.org/.
|
||||
|
||||
You must have a Roundup account to report bugs; this makes it possible for us to
|
||||
contact you if we have follow-up questions. It will also enable Roundup to send
|
||||
you updates as we act on your bug. If you had previously used SourceForge to
|
||||
report bugs to Python, you can obtain your Roundup password through Roundup's
|
||||
`password reset procedure <https://bugs.python.org/user?@template=forgotten>`_.
|
||||
|
||||
For more information on how Python is developed, consult `the Python Developer's
|
||||
Guide <https://devguide.python.org/>`_.
|
||||
|
||||
|
||||
Are there any published articles about Python that I can reference?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
It's probably best to cite your favorite book about Python.
|
||||
|
||||
The very first article about Python was written in 1991 and is now quite
|
||||
outdated.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Are there any books on Python?
|
||||
------------------------------
|
||||
|
||||
Yes, there are many, and more are being published. See the python.org wiki at
|
||||
https://wiki.python.org/moin/PythonBooks for a list.
|
||||
|
||||
You can also search online bookstores for "Python" and filter out the Monty
|
||||
Python references; or perhaps search for "Python" and "language".
|
||||
|
||||
|
||||
Where in the world is www.python.org located?
|
||||
---------------------------------------------
|
||||
|
||||
The Python project's infrastructure is located all over the world and is managed
|
||||
by the Python Infrastructure Team. Details `here <http://infra.psf.io>`__.
|
||||
|
||||
|
||||
Why is it called Python?
|
||||
------------------------
|
||||
|
||||
When he began implementing Python, Guido van Rossum was also reading the
|
||||
published scripts from `"Monty Python's Flying Circus"
|
||||
<https://en.wikipedia.org/wiki/Monty_Python>`__, a BBC comedy series from the 1970s. Van Rossum
|
||||
thought he needed a name that was short, unique, and slightly mysterious, so he
|
||||
decided to call the language Python.
|
||||
|
||||
|
||||
Do I have to like "Monty Python's Flying Circus"?
|
||||
-------------------------------------------------
|
||||
|
||||
No, but it helps. :)
|
||||
|
||||
|
||||
Python in the real world
|
||||
========================
|
||||
|
||||
How stable is Python?
|
||||
---------------------
|
||||
|
||||
Very stable. New, stable releases have been coming out roughly every 6 to 18
|
||||
months since 1991, and this seems likely to continue. Currently there are
|
||||
usually around 18 months between major releases.
|
||||
|
||||
The developers issue "bugfix" releases of older versions, so the stability of
|
||||
existing releases gradually improves. Bugfix releases, indicated by a third
|
||||
component of the version number (e.g. 3.5.3, 3.6.2), are managed for stability;
|
||||
only fixes for known problems are included in a bugfix release, and it's
|
||||
guaranteed that interfaces will remain the same throughout a series of bugfix
|
||||
releases.
|
||||
|
||||
The latest stable releases can always be found on the `Python download page
|
||||
<https://www.python.org/downloads/>`_. There are two production-ready versions
|
||||
of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by
|
||||
most widely used libraries. Although 2.x is still widely used, `it will not
|
||||
be maintained after January 1, 2020 <https://www.python.org/dev/peps/pep-0373/>`_.
|
||||
|
||||
How many people are using Python?
|
||||
---------------------------------
|
||||
|
||||
There are probably tens of thousands of users, though it's difficult to obtain
|
||||
an exact count.
|
||||
|
||||
Python is available for free download, so there are no sales figures, and it's
|
||||
available from many different sites and packaged with many Linux distributions,
|
||||
so download statistics don't tell the whole story either.
|
||||
|
||||
The comp.lang.python newsgroup is very active, but not all Python users post to
|
||||
the group or even read it.
|
||||
|
||||
|
||||
Have any significant projects been done in Python?
|
||||
--------------------------------------------------
|
||||
|
||||
See https://www.python.org/about/success for a list of projects that use Python.
|
||||
Consulting the proceedings for `past Python conferences
|
||||
<https://www.python.org/community/workshops/>`_ will reveal contributions from many
|
||||
different companies and organizations.
|
||||
|
||||
High-profile Python projects include `the Mailman mailing list manager
|
||||
<http://www.list.org>`_ and `the Zope application server
|
||||
<http://www.zope.org>`_. Several Linux distributions, most notably `Red Hat
|
||||
<https://www.redhat.com>`_, have written part or all of their installer and
|
||||
system administration software in Python. Companies that use Python internally
|
||||
include Google, Yahoo, and Lucasfilm Ltd.
|
||||
|
||||
|
||||
What new developments are expected for Python in the future?
|
||||
------------------------------------------------------------
|
||||
|
||||
See https://www.python.org/dev/peps/ for the Python Enhancement Proposals
|
||||
(PEPs). PEPs are design documents describing a suggested new feature for Python,
|
||||
providing a concise technical specification and a rationale. Look for a PEP
|
||||
titled "Python X.Y Release Schedule", where X.Y is a version that hasn't been
|
||||
publicly released yet.
|
||||
|
||||
New development is discussed on `the python-dev mailing list
|
||||
<https://mail.python.org/mailman/listinfo/python-dev/>`_.
|
||||
|
||||
|
||||
Is it reasonable to propose incompatible changes to Python?
|
||||
-----------------------------------------------------------
|
||||
|
||||
In general, no. There are already millions of lines of Python code around the
|
||||
world, so any change 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's still the problem of updating all documentation;
|
||||
many books have been written about Python, and we don't want to invalidate them
|
||||
all at a single stroke.
|
||||
|
||||
Providing a gradual upgrade path is necessary if a feature has to be changed.
|
||||
:pep:`5` describes the procedure followed for introducing backward-incompatible
|
||||
changes while minimizing disruption for users.
|
||||
|
||||
|
||||
Is Python a good language for beginning programmers?
|
||||
----------------------------------------------------
|
||||
|
||||
Yes.
|
||||
|
||||
It is still common to start students with a procedural and statically typed
|
||||
language such as Pascal, C, or a subset of C++ or Java. Students may be better
|
||||
served by learning Python as their first language. Python has a very simple and
|
||||
consistent syntax and a large standard library and, most importantly, using
|
||||
Python in a beginning programming course lets students concentrate on important
|
||||
programming skills such as problem decomposition and data type design. With
|
||||
Python, students can be quickly introduced to basic concepts such as loops and
|
||||
procedures. They can probably even work with user-defined objects in their very
|
||||
first course.
|
||||
|
||||
For a student who has never programmed before, using a statically typed language
|
||||
seems unnatural. It presents additional complexity that the student must master
|
||||
and slows the pace of the course. The students are trying to learn to think
|
||||
like a computer, decompose problems, design consistent interfaces, and
|
||||
encapsulate data. While learning to use a statically typed language is
|
||||
important in the long term, it is not necessarily the best topic to address in
|
||||
the students' first programming course.
|
||||
|
||||
Many other aspects of Python make it a good first language. Like Java, Python
|
||||
has a large standard library so that students can be assigned programming
|
||||
projects very early in the course that *do* something. Assignments aren't
|
||||
restricted to the standard four-function calculator and check balancing
|
||||
programs. By using the standard library, students can gain the satisfaction of
|
||||
working on realistic applications as they learn the fundamentals of programming.
|
||||
Using the standard library also teaches students about code reuse. Third-party
|
||||
modules such as PyGame are also helpful in extending the students' reach.
|
||||
|
||||
Python's interactive interpreter enables students to test language features
|
||||
while they're programming. They can keep a window with the interpreter running
|
||||
while they enter their program's source in another window. If they can't
|
||||
remember the methods for a list, they can do something like this::
|
||||
|
||||
>>> L = []
|
||||
>>> dir(L) # doctest: +NORMALIZE_WHITESPACE
|
||||
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
|
||||
'__dir__', '__doc__', '__eq__', '__format__', '__ge__',
|
||||
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',
|
||||
'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
|
||||
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
|
||||
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
|
||||
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
|
||||
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
|
||||
'reverse', 'sort']
|
||||
>>> [d for d in dir(L) if '__' not in d]
|
||||
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
|
||||
|
||||
>>> help(L.append)
|
||||
Help on built-in function append:
|
||||
<BLANKLINE>
|
||||
append(...)
|
||||
L.append(object) -> None -- append object to end
|
||||
<BLANKLINE>
|
||||
>>> L.append(1)
|
||||
>>> L
|
||||
[1]
|
||||
|
||||
With the interpreter, documentation is never far from the student as they are
|
||||
programming.
|
||||
|
||||
There are also good IDEs for Python. IDLE is a cross-platform IDE for Python
|
||||
that is written in Python using Tkinter. PythonWin is a Windows-specific IDE.
|
||||
Emacs users will be happy to know that there is a very good Python mode for
|
||||
Emacs. All of these programming environments provide syntax highlighting,
|
||||
auto-indenting, and access to the interactive interpreter while coding. Consult
|
||||
`the Python wiki <https://wiki.python.org/moin/PythonEditors>`_ for a full list
|
||||
of Python editing environments.
|
||||
|
||||
If you want to discuss Python's use in education, you may be interested in
|
||||
joining `the edu-sig mailing list
|
||||
<https://www.python.org/community/sigs/current/edu-sig>`_.
|
159
python-3.7.4-docs-html/_sources/faq/gui.rst.txt
Normal file
159
python-3.7.4-docs-html/_sources/faq/gui.rst.txt
Normal file
@@ -0,0 +1,159 @@
|
||||
:tocdepth: 2
|
||||
|
||||
==========================
|
||||
Graphic User Interface FAQ
|
||||
==========================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
.. XXX need review for Python 3.
|
||||
|
||||
|
||||
General GUI Questions
|
||||
=====================
|
||||
|
||||
What platform-independent GUI toolkits exist for Python?
|
||||
========================================================
|
||||
|
||||
Depending on what platform(s) you are aiming at, there are several. Some
|
||||
of them haven't been ported to Python 3 yet. At least `Tkinter`_ and `Qt`_
|
||||
are known to be Python 3-compatible.
|
||||
|
||||
.. XXX check links
|
||||
|
||||
Tkinter
|
||||
-------
|
||||
|
||||
Standard builds of Python include an object-oriented interface to the Tcl/Tk
|
||||
widget set, called :ref:`tkinter <Tkinter>`. This is probably the easiest to
|
||||
install (since it comes included with most
|
||||
`binary distributions <https://www.python.org/downloads/>`_ of Python) and use.
|
||||
For more info about Tk, including pointers to the source, see the
|
||||
`Tcl/Tk home page <https://www.tcl.tk>`_. Tcl/Tk is fully portable to the
|
||||
Mac OS X, Windows, and Unix platforms.
|
||||
|
||||
wxWidgets
|
||||
---------
|
||||
|
||||
wxWidgets (https://www.wxwidgets.org) is a free, portable GUI class
|
||||
library written in C++ that provides a native look and feel on a
|
||||
number of platforms, with Windows, Mac OS X, GTK, X11, all listed as
|
||||
current stable targets. Language bindings are available for a number
|
||||
of languages including Python, Perl, Ruby, etc.
|
||||
|
||||
`wxPython <https://www.wxpython.org>`_ is the Python binding for
|
||||
wxwidgets. While it often lags slightly behind the official wxWidgets
|
||||
releases, it also offers a number of features via pure Python
|
||||
extensions that are not available in other language bindings. There
|
||||
is an active wxPython user and developer community.
|
||||
|
||||
Both wxWidgets and wxPython are free, open source, software with
|
||||
permissive licences that allow their use in commercial products as
|
||||
well as in freeware or shareware.
|
||||
|
||||
|
||||
Qt
|
||||
---
|
||||
|
||||
There are bindings available for the Qt toolkit (using either `PyQt
|
||||
<https://riverbankcomputing.com/software/pyqt/intro>`_ or `PySide
|
||||
<https://wiki.qt.io/PySide>`_) and for KDE (`PyKDE4 <https://techbase.kde.org/Languages/Python/Using_PyKDE_4>`__).
|
||||
PyQt is currently more mature than PySide, but you must buy a PyQt license from
|
||||
`Riverbank Computing <https://www.riverbankcomputing.com/commercial/license-faq>`_
|
||||
if you want to write proprietary applications. PySide is free for all applications.
|
||||
|
||||
Qt 4.5 upwards is licensed under the LGPL license; also, commercial licenses
|
||||
are available from `The Qt Company <https://www.qt.io/licensing/>`_.
|
||||
|
||||
Gtk+
|
||||
----
|
||||
|
||||
The `GObject introspection bindings <https://wiki.gnome.org/Projects/PyGObject>`_
|
||||
for Python allow you to write GTK+ 3 applications. There is also a
|
||||
`Python GTK+ 3 Tutorial <https://python-gtk-3-tutorial.readthedocs.io>`_.
|
||||
|
||||
The older PyGtk bindings for the `Gtk+ 2 toolkit <https://www.gtk.org>`_ have
|
||||
been implemented by James Henstridge; see <http://www.pygtk.org>.
|
||||
|
||||
Kivy
|
||||
----
|
||||
|
||||
`Kivy <https://kivy.org/>`_ is a cross-platform GUI library supporting both
|
||||
desktop operating systems (Windows, macOS, Linux) and mobile devices (Android,
|
||||
iOS). It is written in Python and Cython, and can use a range of windowing
|
||||
backends.
|
||||
|
||||
Kivy is free and open source software distributed under the MIT license.
|
||||
|
||||
FLTK
|
||||
----
|
||||
|
||||
Python bindings for `the FLTK toolkit <http://www.fltk.org>`_, a simple yet
|
||||
powerful and mature cross-platform windowing system, are available from `the
|
||||
PyFLTK project <http://pyfltk.sourceforge.net>`_.
|
||||
|
||||
OpenGL
|
||||
------
|
||||
|
||||
For OpenGL bindings, see `PyOpenGL <http://pyopengl.sourceforge.net>`_.
|
||||
|
||||
|
||||
What platform-specific GUI toolkits exist for Python?
|
||||
========================================================
|
||||
|
||||
By installing the `PyObjc Objective-C bridge
|
||||
<https://pypi.org/project/pyobjc/>`_, Python programs can use Mac OS X's
|
||||
Cocoa libraries.
|
||||
|
||||
:ref:`Pythonwin <windows-faq>` by Mark Hammond includes an interface to the
|
||||
Microsoft Foundation Classes and a Python programming environment
|
||||
that's written mostly in Python using the MFC classes.
|
||||
|
||||
|
||||
Tkinter questions
|
||||
=================
|
||||
|
||||
How do I freeze Tkinter applications?
|
||||
-------------------------------------
|
||||
|
||||
Freeze is a tool to create stand-alone applications. When freezing Tkinter
|
||||
applications, the applications will not be truly stand-alone, as the application
|
||||
will still need the Tcl and Tk libraries.
|
||||
|
||||
One solution is to ship the application with the Tcl and Tk libraries, and point
|
||||
to them at run-time using the :envvar:`TCL_LIBRARY` and :envvar:`TK_LIBRARY`
|
||||
environment variables.
|
||||
|
||||
To get truly stand-alone applications, the Tcl scripts that form the library
|
||||
have to be integrated into the application as well. One tool supporting that is
|
||||
SAM (stand-alone modules), which is part of the Tix distribution
|
||||
(http://tix.sourceforge.net/).
|
||||
|
||||
Build Tix with SAM enabled, perform the appropriate call to
|
||||
:c:func:`Tclsam_init`, etc. inside Python's
|
||||
:file:`Modules/tkappinit.c`, and link with libtclsam and libtksam (you
|
||||
might include the Tix libraries as well).
|
||||
|
||||
|
||||
Can I have Tk events handled while waiting for I/O?
|
||||
---------------------------------------------------
|
||||
|
||||
On platforms other than Windows, 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 :c:func:`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. See :ref:`tkinter-file-handlers`.
|
||||
|
||||
|
||||
I can't get key bindings to work in Tkinter: why?
|
||||
-------------------------------------------------
|
||||
|
||||
An often-heard complaint is that event handlers bound to events with the
|
||||
:meth:`bind` method don't get handled even when the appropriate key is pressed.
|
||||
|
||||
The most common cause is that the widget to which the binding applies doesn't
|
||||
have "keyboard focus". Check out the Tk documentation for the focus command.
|
||||
Usually a widget is given the keyboard focus by clicking in it (but not for
|
||||
labels; see the takefocus option).
|
17
python-3.7.4-docs-html/_sources/faq/index.rst.txt
Normal file
17
python-3.7.4-docs-html/_sources/faq/index.rst.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
.. _faq-index:
|
||||
|
||||
###################################
|
||||
Python Frequently Asked Questions
|
||||
###################################
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
general.rst
|
||||
programming.rst
|
||||
design.rst
|
||||
library.rst
|
||||
extending.rst
|
||||
windows.rst
|
||||
gui.rst
|
||||
installed.rst
|
53
python-3.7.4-docs-html/_sources/faq/installed.rst.txt
Normal file
53
python-3.7.4-docs-html/_sources/faq/installed.rst.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
=============================================
|
||||
"Why is Python Installed on my Computer?" FAQ
|
||||
=============================================
|
||||
|
||||
What is Python?
|
||||
---------------
|
||||
|
||||
Python is a programming language. It's used for many different applications.
|
||||
It's used in some high schools and colleges as an introductory programming
|
||||
language because Python is easy to learn, but it's also used by professional
|
||||
software developers at places such as Google, NASA, and Lucasfilm Ltd.
|
||||
|
||||
If you wish to learn more about Python, start with the `Beginner's Guide to
|
||||
Python <https://wiki.python.org/moin/BeginnersGuide>`_.
|
||||
|
||||
|
||||
Why is Python installed on my machine?
|
||||
--------------------------------------
|
||||
|
||||
If you find Python installed on your system but don't remember installing it,
|
||||
there are several possible ways it could have gotten there.
|
||||
|
||||
* Perhaps another user on the computer wanted to learn programming and installed
|
||||
it; you'll have to figure out who's been using the machine and might have
|
||||
installed it.
|
||||
* A third-party application installed on the machine might have been written in
|
||||
Python and included a Python installation. There are many such applications,
|
||||
from GUI programs to network servers and administrative scripts.
|
||||
* Some Windows machines also have Python installed. At this writing we're aware
|
||||
of computers from Hewlett-Packard and Compaq that include Python. Apparently
|
||||
some of HP/Compaq's administrative tools are written in Python.
|
||||
* Many Unix-compatible operating systems, such as Mac OS X and some Linux
|
||||
distributions, have Python installed by default; it's included in the base
|
||||
installation.
|
||||
|
||||
|
||||
Can I delete Python?
|
||||
--------------------
|
||||
|
||||
That depends on where Python came from.
|
||||
|
||||
If someone installed it deliberately, you can remove it without hurting
|
||||
anything. On Windows, use the Add/Remove Programs icon in the Control Panel.
|
||||
|
||||
If Python was installed by a third-party application, you can also remove it,
|
||||
but that application will no longer work. You should use that application's
|
||||
uninstaller rather than removing Python directly.
|
||||
|
||||
If Python came with your operating system, removing it is not recommended. If
|
||||
you remove it, whatever tools were written in Python will no longer run, and
|
||||
some of them might be important to you. Reinstalling the whole system would
|
||||
then be required to fix things again.
|
||||
|
839
python-3.7.4-docs-html/_sources/faq/library.rst.txt
Normal file
839
python-3.7.4-docs-html/_sources/faq/library.rst.txt
Normal file
@@ -0,0 +1,839 @@
|
||||
:tocdepth: 2
|
||||
|
||||
=========================
|
||||
Library and Extension FAQ
|
||||
=========================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
General Library Questions
|
||||
=========================
|
||||
|
||||
How do I find a module or application to perform task X?
|
||||
--------------------------------------------------------
|
||||
|
||||
Check :ref:`the Library Reference <library-index>` to see if there's a relevant
|
||||
standard library module. (Eventually you'll learn what's in the standard
|
||||
library and will be able to skip this step.)
|
||||
|
||||
For third-party packages, search the `Python Package Index
|
||||
<https://pypi.org>`_ or try `Google <https://www.google.com>`_ or
|
||||
another Web search engine. Searching for "Python" plus a keyword or two for
|
||||
your topic of interest will usually find something helpful.
|
||||
|
||||
|
||||
Where is the math.py (socket.py, regex.py, etc.) source file?
|
||||
-------------------------------------------------------------
|
||||
|
||||
If you can't find a source file for a module it may be a built-in or
|
||||
dynamically loaded module implemented in C, C++ or other compiled language.
|
||||
In this case you may not have the source file or it may be something like
|
||||
:file:`mathmodule.c`, somewhere in a C source directory (not on the Python Path).
|
||||
|
||||
There are (at least) three kinds of modules in Python:
|
||||
|
||||
1) modules written in Python (.py);
|
||||
2) modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, etc);
|
||||
3) modules written in C and linked with the interpreter; to get a list of these,
|
||||
type::
|
||||
|
||||
import sys
|
||||
print(sys.builtin_module_names)
|
||||
|
||||
|
||||
How do I make a Python script executable on Unix?
|
||||
-------------------------------------------------
|
||||
|
||||
You need to do two things: the script file's mode must be executable and the
|
||||
first line must begin with ``#!`` followed by the path of the Python
|
||||
interpreter.
|
||||
|
||||
The first is done by executing ``chmod +x scriptfile`` or perhaps ``chmod 755
|
||||
scriptfile``.
|
||||
|
||||
The second can be done in a number of ways. The most straightforward way is to
|
||||
write ::
|
||||
|
||||
#!/usr/local/bin/python
|
||||
|
||||
as the very first line of your file, using the pathname for where the Python
|
||||
interpreter is installed on your platform.
|
||||
|
||||
If you would like the script to be independent of where the Python interpreter
|
||||
lives, you can use the :program:`env` program. Almost all Unix variants support
|
||||
the following, assuming the Python interpreter is in a directory on the user's
|
||||
:envvar:`PATH`::
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
*Don't* do this for CGI scripts. The :envvar:`PATH` variable for CGI scripts is
|
||||
often very minimal, so you need to use the actual absolute pathname of the
|
||||
interpreter.
|
||||
|
||||
Occasionally, a user's environment is so full that the :program:`/usr/bin/env`
|
||||
program fails; or there's no env program at all. In that case, you can try the
|
||||
following hack (due to Alex Rezinsky):
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#! /bin/sh
|
||||
""":"
|
||||
exec python $0 ${1+"$@"}
|
||||
"""
|
||||
|
||||
The minor disadvantage is that this defines the script's __doc__ string.
|
||||
However, you can fix that by adding ::
|
||||
|
||||
__doc__ = """...Whatever..."""
|
||||
|
||||
|
||||
|
||||
Is there a curses/termcap package for Python?
|
||||
---------------------------------------------
|
||||
|
||||
.. XXX curses *is* built by default, isn't it?
|
||||
|
||||
For Unix variants: The standard Python source distribution comes with a curses
|
||||
module in the :source:`Modules` subdirectory, though it's not compiled by default.
|
||||
(Note that this is not available in the Windows distribution -- there is no
|
||||
curses module for Windows.)
|
||||
|
||||
The :mod:`curses` module supports basic curses features as well as many additional
|
||||
functions from ncurses and SYSV curses such as colour, alternative character set
|
||||
support, pads, and mouse support. This means the module isn't compatible with
|
||||
operating systems that only have BSD curses, but there don't seem to be any
|
||||
currently maintained OSes that fall into this category.
|
||||
|
||||
For Windows: use `the consolelib module
|
||||
<http://effbot.org/zone/console-index.htm>`_.
|
||||
|
||||
|
||||
Is there an equivalent to C's onexit() in Python?
|
||||
-------------------------------------------------
|
||||
|
||||
The :mod:`atexit` module provides a register function that is similar to C's
|
||||
:c:func:`onexit`.
|
||||
|
||||
|
||||
Why don't my signal handlers work?
|
||||
----------------------------------
|
||||
|
||||
The most common problem is that the signal handler is declared with the wrong
|
||||
argument list. It is called as ::
|
||||
|
||||
handler(signum, frame)
|
||||
|
||||
so it should be declared with two arguments::
|
||||
|
||||
def handler(signum, frame):
|
||||
...
|
||||
|
||||
|
||||
Common tasks
|
||||
============
|
||||
|
||||
How do I test a Python program or component?
|
||||
--------------------------------------------
|
||||
|
||||
Python comes with two testing frameworks. The :mod:`doctest` module finds
|
||||
examples in the docstrings for a module and runs them, comparing the output with
|
||||
the expected output given in the docstring.
|
||||
|
||||
The :mod:`unittest` module is a fancier testing framework modelled on Java and
|
||||
Smalltalk testing frameworks.
|
||||
|
||||
To make testing easier, you should use good modular design in your program.
|
||||
Your program should have almost all functionality
|
||||
encapsulated in either functions or class methods -- and this sometimes has the
|
||||
surprising and delightful effect of making the program run faster (because local
|
||||
variable accesses are faster than global accesses). Furthermore the program
|
||||
should avoid depending on mutating global variables, since this makes testing
|
||||
much more difficult to do.
|
||||
|
||||
The "global main logic" of your program may be as simple as ::
|
||||
|
||||
if __name__ == "__main__":
|
||||
main_logic()
|
||||
|
||||
at the bottom of the main module of your program.
|
||||
|
||||
Once your program is organized as a tractable collection of functions and class
|
||||
behaviours you should write test functions that exercise the behaviours. A test
|
||||
suite that automates a sequence of tests can be associated with each module.
|
||||
This sounds like a lot of work, but since Python is so terse and flexible it's
|
||||
surprisingly easy. You can make coding much more pleasant and fun by writing
|
||||
your test functions in parallel with the "production code", since this makes it
|
||||
easy to find bugs and even design flaws earlier.
|
||||
|
||||
"Support modules" that are not intended to be the main module of a program may
|
||||
include a self-test of the module. ::
|
||||
|
||||
if __name__ == "__main__":
|
||||
self_test()
|
||||
|
||||
Even programs that interact with complex external interfaces may be tested when
|
||||
the external interfaces are unavailable by using "fake" interfaces implemented
|
||||
in Python.
|
||||
|
||||
|
||||
How do I create documentation from doc strings?
|
||||
-----------------------------------------------
|
||||
|
||||
The :mod:`pydoc` module can create HTML from the doc strings in your Python
|
||||
source code. An alternative for creating API documentation purely from
|
||||
docstrings is `epydoc <http://epydoc.sourceforge.net/>`_. `Sphinx
|
||||
<http://sphinx-doc.org>`_ can also include docstring content.
|
||||
|
||||
|
||||
How do I get a single keypress at a time?
|
||||
-----------------------------------------
|
||||
|
||||
For Unix variants there are several solutions. It's straightforward to do this
|
||||
using curses, but curses is a fairly large module to learn.
|
||||
|
||||
.. XXX this doesn't work out of the box, some IO expert needs to check why
|
||||
|
||||
Here's a solution without curses::
|
||||
|
||||
import termios, fcntl, sys, os
|
||||
fd = sys.stdin.fileno()
|
||||
|
||||
oldterm = termios.tcgetattr(fd)
|
||||
newattr = termios.tcgetattr(fd)
|
||||
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
|
||||
termios.tcsetattr(fd, termios.TCSANOW, newattr)
|
||||
|
||||
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
|
||||
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
|
||||
|
||||
try:
|
||||
while True:
|
||||
try:
|
||||
c = sys.stdin.read(1)
|
||||
print("Got character", repr(c))
|
||||
except OSError:
|
||||
pass
|
||||
finally:
|
||||
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
|
||||
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
|
||||
|
||||
You need the :mod:`termios` and the :mod:`fcntl` module for any of this to
|
||||
work, and I've only tried it on Linux, though it should work elsewhere. In
|
||||
this code, characters are read and printed one at a time.
|
||||
|
||||
:func:`termios.tcsetattr` turns off stdin's echoing and disables canonical
|
||||
mode. :func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags
|
||||
and modify them for non-blocking mode. Since reading stdin when it is empty
|
||||
results in an :exc:`OSError`, this error is caught and ignored.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
*sys.stdin.read* used to raise :exc:`IOError`. Starting from Python 3.3
|
||||
:exc:`IOError` is alias for :exc:`OSError`.
|
||||
|
||||
|
||||
Threads
|
||||
=======
|
||||
|
||||
How do I program using threads?
|
||||
-------------------------------
|
||||
|
||||
Be sure to use the :mod:`threading` module and not the :mod:`_thread` module.
|
||||
The :mod:`threading` module builds convenient abstractions on top of the
|
||||
low-level primitives provided by the :mod:`_thread` module.
|
||||
|
||||
Aahz has a set of slides from his threading tutorial that are helpful; see
|
||||
http://www.pythoncraft.com/OSCON2001/.
|
||||
|
||||
|
||||
None of my threads seem to run: why?
|
||||
------------------------------------
|
||||
|
||||
As soon as the main thread exits, all threads are killed. Your main thread is
|
||||
running too quickly, giving the threads no time to do any work.
|
||||
|
||||
A simple fix is to add a sleep to the end of the program that's long enough for
|
||||
all the threads to finish::
|
||||
|
||||
import threading, time
|
||||
|
||||
def thread_task(name, n):
|
||||
for i in range(n):
|
||||
print(name, i)
|
||||
|
||||
for i in range(10):
|
||||
T = threading.Thread(target=thread_task, args=(str(i), i))
|
||||
T.start()
|
||||
|
||||
time.sleep(10) # <---------------------------!
|
||||
|
||||
But now (on many platforms) the threads don't run in parallel, but appear to run
|
||||
sequentially, one at a time! The reason is that the OS thread scheduler doesn't
|
||||
start a new thread until the previous thread is blocked.
|
||||
|
||||
A simple fix is to add a tiny sleep to the start of the run function::
|
||||
|
||||
def thread_task(name, n):
|
||||
time.sleep(0.001) # <--------------------!
|
||||
for i in range(n):
|
||||
print(name, i)
|
||||
|
||||
for i in range(10):
|
||||
T = threading.Thread(target=thread_task, args=(str(i), i))
|
||||
T.start()
|
||||
|
||||
time.sleep(10)
|
||||
|
||||
Instead of trying to guess a good delay value for :func:`time.sleep`,
|
||||
it's better to use some kind of semaphore mechanism. One idea is to use the
|
||||
:mod:`queue` module to create a queue object, let each thread append a token to
|
||||
the queue when it finishes, and let the main thread read as many tokens from the
|
||||
queue as there are threads.
|
||||
|
||||
|
||||
How do I parcel out work among a bunch of worker threads?
|
||||
---------------------------------------------------------
|
||||
|
||||
The easiest way is to use the new :mod:`concurrent.futures` module,
|
||||
especially the :mod:`~concurrent.futures.ThreadPoolExecutor` class.
|
||||
|
||||
Or, if you want fine control over the dispatching algorithm, you can write
|
||||
your own logic manually. Use the :mod:`queue` module to create a queue
|
||||
containing a list of jobs. The :class:`~queue.Queue` class maintains a
|
||||
list of objects and has a ``.put(obj)`` method that adds items to the queue and
|
||||
a ``.get()`` method to return them. The class will take care of the locking
|
||||
necessary to ensure that each job is handed out exactly once.
|
||||
|
||||
Here's a trivial example::
|
||||
|
||||
import threading, queue, time
|
||||
|
||||
# The worker thread gets jobs off the queue. When the queue is empty, it
|
||||
# assumes there will be no more work and exits.
|
||||
# (Realistically workers will run until terminated.)
|
||||
def worker():
|
||||
print('Running worker')
|
||||
time.sleep(0.1)
|
||||
while True:
|
||||
try:
|
||||
arg = q.get(block=False)
|
||||
except queue.Empty:
|
||||
print('Worker', threading.currentThread(), end=' ')
|
||||
print('queue empty')
|
||||
break
|
||||
else:
|
||||
print('Worker', threading.currentThread(), end=' ')
|
||||
print('running with argument', arg)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Create queue
|
||||
q = queue.Queue()
|
||||
|
||||
# Start a pool of 5 workers
|
||||
for i in range(5):
|
||||
t = threading.Thread(target=worker, name='worker %i' % (i+1))
|
||||
t.start()
|
||||
|
||||
# Begin adding work to the queue
|
||||
for i in range(50):
|
||||
q.put(i)
|
||||
|
||||
# Give threads time to run
|
||||
print('Main thread sleeping')
|
||||
time.sleep(5)
|
||||
|
||||
When run, this will produce the following output:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
Running worker
|
||||
Running worker
|
||||
Running worker
|
||||
Running worker
|
||||
Running worker
|
||||
Main thread sleeping
|
||||
Worker <Thread(worker 1, started 130283832797456)> running with argument 0
|
||||
Worker <Thread(worker 2, started 130283824404752)> running with argument 1
|
||||
Worker <Thread(worker 3, started 130283816012048)> running with argument 2
|
||||
Worker <Thread(worker 4, started 130283807619344)> running with argument 3
|
||||
Worker <Thread(worker 5, started 130283799226640)> running with argument 4
|
||||
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
|
||||
...
|
||||
|
||||
Consult the module's documentation for more details; the :class:`~queue.Queue`
|
||||
class provides a featureful interface.
|
||||
|
||||
|
||||
What kinds of global value mutation are thread-safe?
|
||||
----------------------------------------------------
|
||||
|
||||
A :term:`global interpreter lock` (GIL) is used internally to ensure that only one
|
||||
thread runs in the Python VM at a time. In general, Python offers to switch
|
||||
among threads only between bytecode instructions; how frequently it switches can
|
||||
be set via :func:`sys.setswitchinterval`. Each bytecode instruction and
|
||||
therefore all the C implementation code reached from each instruction is
|
||||
therefore atomic from the point of view of a Python program.
|
||||
|
||||
In theory, this means an exact accounting requires an exact understanding of the
|
||||
PVM bytecode implementation. In practice, it means that operations on shared
|
||||
variables of built-in data types (ints, lists, dicts, etc) that "look atomic"
|
||||
really are.
|
||||
|
||||
For example, the following operations are all atomic (L, L1, L2 are lists, D,
|
||||
D1, D2 are dicts, x, y are objects, i, j are ints)::
|
||||
|
||||
L.append(x)
|
||||
L1.extend(L2)
|
||||
x = L[i]
|
||||
x = L.pop()
|
||||
L1[i:j] = L2
|
||||
L.sort()
|
||||
x = y
|
||||
x.field = y
|
||||
D[x] = y
|
||||
D1.update(D2)
|
||||
D.keys()
|
||||
|
||||
These aren't::
|
||||
|
||||
i = i+1
|
||||
L.append(L[-1])
|
||||
L[i] = L[j]
|
||||
D[x] = D[x] + 1
|
||||
|
||||
Operations that replace other objects may invoke those other objects'
|
||||
:meth:`__del__` method when their reference count reaches zero, and that can
|
||||
affect things. This is especially true for the mass updates to dictionaries and
|
||||
lists. When in doubt, use a mutex!
|
||||
|
||||
|
||||
Can't we get rid of the Global Interpreter Lock?
|
||||
------------------------------------------------
|
||||
|
||||
.. XXX link to dbeazley's talk about GIL?
|
||||
|
||||
The :term:`global interpreter lock` (GIL) is often seen as a hindrance to Python's
|
||||
deployment on high-end multiprocessor server machines, because a multi-threaded
|
||||
Python program effectively only uses one CPU, due to the insistence that
|
||||
(almost) all Python code can only run while the GIL is held.
|
||||
|
||||
Back in the days of Python 1.5, Greg Stein actually implemented a comprehensive
|
||||
patch set (the "free threading" patches) that removed the GIL and replaced it
|
||||
with fine-grained locking. Adam Olsen recently did a similar experiment
|
||||
in his `python-safethread <https://code.google.com/archive/p/python-safethread>`_
|
||||
project. Unfortunately, both experiments exhibited a sharp drop in single-thread
|
||||
performance (at least 30% slower), due to the amount of fine-grained locking
|
||||
necessary to compensate for the removal of the GIL.
|
||||
|
||||
This doesn't mean that you can't make good use of Python on multi-CPU machines!
|
||||
You just have to be creative with dividing the work up between multiple
|
||||
*processes* rather than multiple *threads*. The
|
||||
:class:`~concurrent.futures.ProcessPoolExecutor` class in the new
|
||||
:mod:`concurrent.futures` module provides an easy way of doing so; the
|
||||
:mod:`multiprocessing` module provides a lower-level API in case you want
|
||||
more control over dispatching of tasks.
|
||||
|
||||
Judicious use of C extensions will also help; if you use a C extension to
|
||||
perform a time-consuming task, the extension can release the GIL while the
|
||||
thread of execution is in the C code and allow other threads to get some work
|
||||
done. Some standard library modules such as :mod:`zlib` and :mod:`hashlib`
|
||||
already do this.
|
||||
|
||||
It has been suggested that the GIL should be a per-interpreter-state lock rather
|
||||
than truly global; interpreters then wouldn't be able to share objects.
|
||||
Unfortunately, this isn't likely to happen either. It would be a tremendous
|
||||
amount of work, because many object implementations currently have global state.
|
||||
For example, small integers and short strings are cached; these caches would
|
||||
have to be moved to the interpreter state. Other object types have their own
|
||||
free list; these free lists would have to be moved to the interpreter state.
|
||||
And so on.
|
||||
|
||||
And I doubt that it can even be done in finite time, because the same problem
|
||||
exists for 3rd party extensions. It is likely that 3rd party extensions are
|
||||
being written at a faster rate than you can convert them to store all their
|
||||
global state in the interpreter state.
|
||||
|
||||
And finally, once you have multiple interpreters not sharing any state, what
|
||||
have you gained over running each interpreter in a separate process?
|
||||
|
||||
|
||||
Input and Output
|
||||
================
|
||||
|
||||
How do I delete a file? (And other file questions...)
|
||||
-----------------------------------------------------
|
||||
|
||||
Use ``os.remove(filename)`` or ``os.unlink(filename)``; for documentation, see
|
||||
the :mod:`os` module. The two functions are identical; :func:`~os.unlink` is simply
|
||||
the name of the Unix system call for this function.
|
||||
|
||||
To remove a directory, use :func:`os.rmdir`; use :func:`os.mkdir` to create one.
|
||||
``os.makedirs(path)`` will create any intermediate directories in ``path`` that
|
||||
don't exist. ``os.removedirs(path)`` will remove intermediate directories as
|
||||
long as they're empty; if you want to delete an entire directory tree and its
|
||||
contents, use :func:`shutil.rmtree`.
|
||||
|
||||
To rename a file, use ``os.rename(old_path, new_path)``.
|
||||
|
||||
To truncate a file, open it using ``f = open(filename, "rb+")``, and use
|
||||
``f.truncate(offset)``; offset defaults to the current seek position. There's
|
||||
also ``os.ftruncate(fd, offset)`` for files opened with :func:`os.open`, where
|
||||
*fd* is the file descriptor (a small integer).
|
||||
|
||||
The :mod:`shutil` module also contains a number of functions to work on files
|
||||
including :func:`~shutil.copyfile`, :func:`~shutil.copytree`, and
|
||||
:func:`~shutil.rmtree`.
|
||||
|
||||
|
||||
How do I copy a file?
|
||||
---------------------
|
||||
|
||||
The :mod:`shutil` module contains a :func:`~shutil.copyfile` function. Note
|
||||
that on MacOS 9 it doesn't copy the resource fork and Finder info.
|
||||
|
||||
|
||||
How do I read (or write) binary data?
|
||||
-------------------------------------
|
||||
|
||||
To read or write complex binary data formats, it's best to use the :mod:`struct`
|
||||
module. It allows you to take a string containing binary data (usually numbers)
|
||||
and convert it to Python objects; and vice versa.
|
||||
|
||||
For example, the following code reads two 2-byte integers and one 4-byte integer
|
||||
in big-endian format from a file::
|
||||
|
||||
import struct
|
||||
|
||||
with open(filename, "rb") as f:
|
||||
s = f.read(8)
|
||||
x, y, z = struct.unpack(">hhl", s)
|
||||
|
||||
The '>' in the format string forces big-endian data; the letter 'h' reads one
|
||||
"short integer" (2 bytes), and 'l' reads one "long integer" (4 bytes) from the
|
||||
string.
|
||||
|
||||
For data that is more regular (e.g. a homogeneous list of ints or floats),
|
||||
you can also use the :mod:`array` module.
|
||||
|
||||
.. note::
|
||||
|
||||
To read and write binary data, it is mandatory to open the file in
|
||||
binary mode (here, passing ``"rb"`` to :func:`open`). If you use
|
||||
``"r"`` instead (the default), the file will be open in text mode
|
||||
and ``f.read()`` will return :class:`str` objects rather than
|
||||
:class:`bytes` objects.
|
||||
|
||||
|
||||
I can't seem to use os.read() on a pipe created with os.popen(); why?
|
||||
---------------------------------------------------------------------
|
||||
|
||||
:func:`os.read` is a low-level function which takes a file descriptor, a small
|
||||
integer representing the opened file. :func:`os.popen` creates a high-level
|
||||
file object, the same type returned by the built-in :func:`open` function.
|
||||
Thus, to read *n* bytes from a pipe *p* created with :func:`os.popen`, you need to
|
||||
use ``p.read(n)``.
|
||||
|
||||
|
||||
.. XXX update to use subprocess. See the :ref:`subprocess-replacements` section.
|
||||
|
||||
How do I run a subprocess with pipes connected to both input and output?
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Use the :mod:`popen2` module. For example::
|
||||
|
||||
import popen2
|
||||
fromchild, tochild = popen2.popen2("command")
|
||||
tochild.write("input\n")
|
||||
tochild.flush()
|
||||
output = fromchild.readline()
|
||||
|
||||
Warning: in general it is unwise to do this because you can easily cause a
|
||||
deadlock where your process is blocked waiting for output from the child
|
||||
while the child is blocked waiting for input from you. This can be caused
|
||||
by the parent expecting the child to output more text than it does or
|
||||
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
|
||||
may have been written to never explicitly flush its output, even if it is
|
||||
interactive, since flushing is normally automatic.
|
||||
|
||||
Note that a deadlock is also possible if you use :func:`popen3` to read
|
||||
stdout and stderr. If one of the two is too large for the internal buffer
|
||||
(increasing the buffer size does not help) and you ``read()`` the other one
|
||||
first, there is a deadlock, too.
|
||||
|
||||
Note on a bug in popen2: unless your program calls ``wait()`` or
|
||||
``waitpid()``, finished child processes are never removed, and eventually
|
||||
calls to popen2 will fail because of a limit on the number of child
|
||||
processes. Calling :func:`os.waitpid` with the :data:`os.WNOHANG` option can
|
||||
prevent this; a good place to insert such a call would be before calling
|
||||
``popen2`` again.
|
||||
|
||||
In many cases, all you really need is to run some data through a command and
|
||||
get the result back. Unless the amount of data is very large, the easiest
|
||||
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 :mod:`tempfile` exports a
|
||||
:func:`~tempfile.mktemp` function to generate unique temporary file names. ::
|
||||
|
||||
import tempfile
|
||||
import os
|
||||
|
||||
class Popen3:
|
||||
"""
|
||||
This is a deadlock-safe version of popen that returns
|
||||
an object with errorlevel, out (a string) and err (a string).
|
||||
(capturestderr may not work under windows.)
|
||||
Example: print(Popen3('grep spam','\n\nhere spam\n\n').out)
|
||||
"""
|
||||
def __init__(self,command,input=None,capturestderr=None):
|
||||
outfile=tempfile.mktemp()
|
||||
command="( %s ) > %s" % (command,outfile)
|
||||
if input:
|
||||
infile=tempfile.mktemp()
|
||||
open(infile,"w").write(input)
|
||||
command=command+" <"+infile
|
||||
if capturestderr:
|
||||
errfile=tempfile.mktemp()
|
||||
command=command+" 2>"+errfile
|
||||
self.errorlevel=os.system(command) >> 8
|
||||
self.out=open(outfile,"r").read()
|
||||
os.remove(outfile)
|
||||
if input:
|
||||
os.remove(infile)
|
||||
if capturestderr:
|
||||
self.err=open(errfile,"r").read()
|
||||
os.remove(errfile)
|
||||
|
||||
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. Or you can use a Python interface to Don Libes'
|
||||
"expect" library. A Python extension that interfaces to expect is called
|
||||
"expy" and available from http://expectpy.sourceforge.net. A pure Python
|
||||
solution that works like expect is `pexpect
|
||||
<https://pypi.org/project/pexpect/>`_.
|
||||
|
||||
|
||||
How do I access the serial (RS232) port?
|
||||
----------------------------------------
|
||||
|
||||
For Win32, POSIX (Linux, BSD, etc.), Jython:
|
||||
|
||||
http://pyserial.sourceforge.net
|
||||
|
||||
For Unix, see a Usenet post by Mitch Chapman:
|
||||
|
||||
https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com
|
||||
|
||||
|
||||
Why doesn't closing sys.stdout (stdin, stderr) really close it?
|
||||
---------------------------------------------------------------
|
||||
|
||||
Python :term:`file objects <file object>` are a high-level layer of
|
||||
abstraction on low-level C file descriptors.
|
||||
|
||||
For most file objects you create in Python via the built-in :func:`open`
|
||||
function, ``f.close()`` marks the Python file object as being closed from
|
||||
Python's point of view, and also arranges to close the underlying C file
|
||||
descriptor. This also happens automatically in ``f``'s destructor, when
|
||||
``f`` becomes garbage.
|
||||
|
||||
But stdin, stdout and stderr are treated specially by Python, because of the
|
||||
special status also given to them by C. Running ``sys.stdout.close()`` marks
|
||||
the Python-level file object as being closed, but does *not* close the
|
||||
associated C file descriptor.
|
||||
|
||||
To close the underlying C file descriptor for one of these three, you should
|
||||
first be sure that's what you really want to do (e.g., you may confuse
|
||||
extension modules trying to do I/O). If it is, use :func:`os.close`::
|
||||
|
||||
os.close(stdin.fileno())
|
||||
os.close(stdout.fileno())
|
||||
os.close(stderr.fileno())
|
||||
|
||||
Or you can use the numeric constants 0, 1 and 2, respectively.
|
||||
|
||||
|
||||
Network/Internet Programming
|
||||
============================
|
||||
|
||||
What WWW tools are there for Python?
|
||||
------------------------------------
|
||||
|
||||
See the chapters titled :ref:`internet` and :ref:`netdata` in the Library
|
||||
Reference Manual. Python has many modules that will help you build server-side
|
||||
and client-side web systems.
|
||||
|
||||
.. XXX check if wiki page is still up to date
|
||||
|
||||
A summary of available frameworks is maintained by Paul Boddie at
|
||||
https://wiki.python.org/moin/WebProgramming\ .
|
||||
|
||||
Cameron Laird maintains a useful set of pages about Python web technologies at
|
||||
http://phaseit.net/claird/comp.lang.python/web_python.
|
||||
|
||||
|
||||
How can I mimic CGI form submission (METHOD=POST)?
|
||||
--------------------------------------------------
|
||||
|
||||
I would like to retrieve web pages that are the result of POSTing a form. Is
|
||||
there existing code that would let me do this easily?
|
||||
|
||||
Yes. Here's a simple example that uses urllib.request::
|
||||
|
||||
#!/usr/local/bin/python
|
||||
|
||||
import urllib.request
|
||||
|
||||
# build the query string
|
||||
qs = "First=Josephine&MI=Q&Last=Public"
|
||||
|
||||
# connect and send the server a path
|
||||
req = urllib.request.urlopen('http://www.some-server.out-there'
|
||||
'/cgi-bin/some-cgi-script', data=qs)
|
||||
with req:
|
||||
msg, hdrs = req.read(), req.info()
|
||||
|
||||
Note that in general for percent-encoded POST operations, query strings must be
|
||||
quoted using :func:`urllib.parse.urlencode`. For example, to send
|
||||
``name=Guy Steele, Jr.``::
|
||||
|
||||
>>> import urllib.parse
|
||||
>>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'})
|
||||
'name=Guy+Steele%2C+Jr.'
|
||||
|
||||
.. seealso:: :ref:`urllib-howto` for extensive examples.
|
||||
|
||||
|
||||
What module should I use to help with generating HTML?
|
||||
------------------------------------------------------
|
||||
|
||||
.. XXX add modern template languages
|
||||
|
||||
You can find a collection of useful links on the `Web Programming wiki page
|
||||
<https://wiki.python.org/moin/WebProgramming>`_.
|
||||
|
||||
|
||||
How do I send mail from a Python script?
|
||||
----------------------------------------
|
||||
|
||||
Use the standard library module :mod:`smtplib`.
|
||||
|
||||
Here's a very simple interactive mail sender that uses it. This method will
|
||||
work on any host that supports an SMTP listener. ::
|
||||
|
||||
import sys, smtplib
|
||||
|
||||
fromaddr = input("From: ")
|
||||
toaddrs = input("To: ").split(',')
|
||||
print("Enter message, end with ^D:")
|
||||
msg = ''
|
||||
while True:
|
||||
line = sys.stdin.readline()
|
||||
if not line:
|
||||
break
|
||||
msg += line
|
||||
|
||||
# The actual mail send
|
||||
server = smtplib.SMTP('localhost')
|
||||
server.sendmail(fromaddr, toaddrs, msg)
|
||||
server.quit()
|
||||
|
||||
A Unix-only alternative uses sendmail. The location of the sendmail program
|
||||
varies between systems; sometimes it is ``/usr/lib/sendmail``, sometimes
|
||||
``/usr/sbin/sendmail``. The sendmail manual page will help you out. Here's
|
||||
some sample code::
|
||||
|
||||
import os
|
||||
|
||||
SENDMAIL = "/usr/sbin/sendmail" # sendmail location
|
||||
p = os.popen("%s -t -i" % SENDMAIL, "w")
|
||||
p.write("To: receiver@example.com\n")
|
||||
p.write("Subject: test\n")
|
||||
p.write("\n") # blank line separating headers from body
|
||||
p.write("Some text\n")
|
||||
p.write("some more text\n")
|
||||
sts = p.close()
|
||||
if sts != 0:
|
||||
print("Sendmail exit status", sts)
|
||||
|
||||
|
||||
How do I avoid blocking in the connect() method of a socket?
|
||||
------------------------------------------------------------
|
||||
|
||||
The :mod:`select` module is commonly used to help with asynchronous I/O on
|
||||
sockets.
|
||||
|
||||
To prevent the TCP connect from blocking, you can set the socket to non-blocking
|
||||
mode. Then when you do the ``connect()``, you will either connect immediately
|
||||
(unlikely) or get an exception that contains the error number as ``.errno``.
|
||||
``errno.EINPROGRESS`` indicates that the connection is in progress, but hasn't
|
||||
finished yet. Different OSes will return different values, so you're going to
|
||||
have to check what's returned on your system.
|
||||
|
||||
You can use the ``connect_ex()`` method to avoid creating an exception. It will
|
||||
just return the errno value. To poll, you can call ``connect_ex()`` again later
|
||||
-- ``0`` or ``errno.EISCONN`` indicate that you're connected -- or you can pass this
|
||||
socket to select to check if it's writable.
|
||||
|
||||
.. note::
|
||||
The :mod:`asyncore` module presents a framework-like approach to the problem
|
||||
of writing non-blocking networking code.
|
||||
The third-party `Twisted <https://twistedmatrix.com/trac/>`_ library is
|
||||
a popular and feature-rich alternative.
|
||||
|
||||
|
||||
Databases
|
||||
=========
|
||||
|
||||
Are there any interfaces to database packages in Python?
|
||||
--------------------------------------------------------
|
||||
|
||||
Yes.
|
||||
|
||||
Interfaces to disk-based hashes such as :mod:`DBM <dbm.ndbm>` and :mod:`GDBM
|
||||
<dbm.gnu>` are also included with standard Python. There is also the
|
||||
:mod:`sqlite3` module, which provides a lightweight disk-based relational
|
||||
database.
|
||||
|
||||
Support for most relational databases is available. See the
|
||||
`DatabaseProgramming wiki page
|
||||
<https://wiki.python.org/moin/DatabaseProgramming>`_ for details.
|
||||
|
||||
|
||||
How do you implement persistent objects in Python?
|
||||
--------------------------------------------------
|
||||
|
||||
The :mod:`pickle` library module solves this in a very general way (though you
|
||||
still can't store things like open files, sockets or windows), and the
|
||||
:mod:`shelve` library module uses pickle and (g)dbm to create persistent
|
||||
mappings containing arbitrary Python objects.
|
||||
|
||||
|
||||
Mathematics and Numerics
|
||||
========================
|
||||
|
||||
How do I generate random numbers in Python?
|
||||
-------------------------------------------
|
||||
|
||||
The standard module :mod:`random` implements a random number generator. Usage
|
||||
is simple::
|
||||
|
||||
import random
|
||||
random.random()
|
||||
|
||||
This returns a random floating point number in the range [0, 1).
|
||||
|
||||
There are also many other specialized generators in this module, such as:
|
||||
|
||||
* ``randrange(a, b)`` chooses an integer in the range [a, b).
|
||||
* ``uniform(a, b)`` chooses a floating point number in the range [a, b).
|
||||
* ``normalvariate(mean, sdev)`` samples the normal (Gaussian) distribution.
|
||||
|
||||
Some higher-level functions operate on sequences directly, such as:
|
||||
|
||||
* ``choice(S)`` chooses random element from a given sequence
|
||||
* ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly
|
||||
|
||||
There's also a ``Random`` class you can instantiate to create independent
|
||||
multiple random number generators.
|
1903
python-3.7.4-docs-html/_sources/faq/programming.rst.txt
Normal file
1903
python-3.7.4-docs-html/_sources/faq/programming.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
284
python-3.7.4-docs-html/_sources/faq/windows.rst.txt
Normal file
284
python-3.7.4-docs-html/_sources/faq/windows.rst.txt
Normal file
@@ -0,0 +1,284 @@
|
||||
:tocdepth: 2
|
||||
|
||||
.. highlightlang:: none
|
||||
|
||||
.. _windows-faq:
|
||||
|
||||
=====================
|
||||
Python on Windows FAQ
|
||||
=====================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
.. XXX need review for Python 3.
|
||||
XXX need review for Windows Vista/Seven?
|
||||
|
||||
.. _faq-run-program-under-windows:
|
||||
|
||||
|
||||
How do I run a Python program under Windows?
|
||||
--------------------------------------------
|
||||
|
||||
This is not necessarily a straightforward question. If you are already familiar
|
||||
with running programs from the Windows command line then everything will seem
|
||||
obvious; otherwise, you might need a little more guidance.
|
||||
|
||||
Unless you use some sort of integrated development environment, you will end up
|
||||
*typing* Windows commands into what is variously referred to as a "DOS window"
|
||||
or "Command prompt window". Usually you can create such a window from your
|
||||
search bar by searching for ``cmd``. You should be able to recognize
|
||||
when you have started such a window because you will see a Windows "command
|
||||
prompt", which usually looks like this:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\>
|
||||
|
||||
The letter may be different, and there might be other things after it, so you
|
||||
might just as easily see something like:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
D:\YourName\Projects\Python>
|
||||
|
||||
depending on how your computer has been set up and what else you have recently
|
||||
done with it. Once you have started such a window, you are well on the way to
|
||||
running Python programs.
|
||||
|
||||
You need to realize that your Python scripts have to be processed by another
|
||||
program called the Python *interpreter*. The interpreter reads your script,
|
||||
compiles it into bytecodes, and then executes the bytecodes to run your
|
||||
program. So, how do you arrange for the interpreter to handle your Python?
|
||||
|
||||
First, you need to make sure that your command window recognises the word
|
||||
"py" as an instruction to start the interpreter. If you have opened a
|
||||
command window, you should try entering the command ``py`` and hitting
|
||||
return:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\Users\YourName> py
|
||||
|
||||
You should then see something like:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
|
||||
Type "help", "copyright", "credits" or "license" for more information.
|
||||
>>>
|
||||
|
||||
You have started the interpreter in "interactive mode". That means you can enter
|
||||
Python statements or expressions interactively and have them executed or
|
||||
evaluated while you wait. This is one of Python's strongest features. Check it
|
||||
by entering a few expressions of your choice and seeing the results:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> print("Hello")
|
||||
Hello
|
||||
>>> "Hello" * 3
|
||||
'HelloHelloHello'
|
||||
|
||||
Many people use the interactive mode as a convenient yet highly programmable
|
||||
calculator. When you want to end your interactive Python session,
|
||||
call the :func:`exit` function or hold the :kbd:`Ctrl` key down
|
||||
while you enter a :kbd:`Z`, then hit the ":kbd:`Enter`" key to get
|
||||
back to your Windows command prompt.
|
||||
|
||||
You may also find that you have a Start-menu entry such as :menuselection:`Start
|
||||
--> Programs --> Python 3.x --> Python (command line)` that results in you
|
||||
seeing the ``>>>`` prompt in a new window. If so, the window will disappear
|
||||
after you call the :func:`exit` function or enter the :kbd:`Ctrl-Z`
|
||||
character; Windows is running a single "python"
|
||||
command in the window, and closes it when you terminate the interpreter.
|
||||
|
||||
Now that we know the ``py`` command is recognized, you can give your
|
||||
Python script to it. You'll have to give either an absolute or a
|
||||
relative path to the Python script. Let's say your Python script is
|
||||
located in your desktop and is named ``hello.py``, and your command
|
||||
prompt is nicely opened in your home directory so you're seeing something
|
||||
similar to::
|
||||
|
||||
C:\Users\YourName>
|
||||
|
||||
So now you'll ask the ``py`` command to give your script to Python by
|
||||
typing ``py`` followed by your script path::
|
||||
|
||||
|
||||
C:\Users\YourName> py Desktop\hello.py
|
||||
hello
|
||||
|
||||
How do I make Python scripts executable?
|
||||
----------------------------------------
|
||||
|
||||
On Windows, the standard Python installer already associates the .py
|
||||
extension with a file type (Python.File) and gives that file type an open
|
||||
command that runs the interpreter (``D:\Program Files\Python\python.exe "%1"
|
||||
%*``). This is enough to make scripts executable from the command prompt as
|
||||
'foo.py'. If you'd rather be able to execute the script by simple typing 'foo'
|
||||
with no extension you need to add .py to the PATHEXT environment variable.
|
||||
|
||||
Why does Python sometimes take so long to start?
|
||||
------------------------------------------------
|
||||
|
||||
Usually Python starts very quickly on Windows, but occasionally there are bug
|
||||
reports that Python suddenly begins to take a long time to start up. This is
|
||||
made even more puzzling because Python will work fine on other Windows systems
|
||||
which appear to be configured identically.
|
||||
|
||||
The problem may be caused by a misconfiguration of virus checking software on
|
||||
the problem machine. Some virus scanners have been known to introduce startup
|
||||
overhead of two orders of magnitude when the scanner is configured to monitor
|
||||
all reads from the filesystem. Try checking the configuration of virus scanning
|
||||
software on your systems to ensure that they are indeed configured identically.
|
||||
McAfee, when configured to scan all file system read activity, is a particular
|
||||
offender.
|
||||
|
||||
|
||||
How do I make an executable from a Python script?
|
||||
-------------------------------------------------
|
||||
|
||||
See `cx_Freeze <https://anthony-tuininga.github.io/cx_Freeze/>`_ for a distutils extension
|
||||
that allows you to create console and GUI executables from Python code.
|
||||
`py2exe <http://www.py2exe.org/>`_, the most popular extension for building
|
||||
Python 2.x-based executables, does not yet support Python 3 but a version that
|
||||
does is in development.
|
||||
|
||||
|
||||
Is a ``*.pyd`` file the same as a DLL?
|
||||
--------------------------------------
|
||||
|
||||
Yes, .pyd files are dll's, but there are a few differences. If you have a DLL
|
||||
named ``foo.pyd``, then it must have a function ``PyInit_foo()``. You can then
|
||||
write Python "import foo", and Python will search for foo.pyd (as well as
|
||||
foo.py, foo.pyc) and if it finds it, will attempt to call ``PyInit_foo()`` to
|
||||
initialize it. You do not link your .exe with foo.lib, as that would cause
|
||||
Windows to require the DLL to be present.
|
||||
|
||||
Note that the search path for foo.pyd is PYTHONPATH, not the same as the path
|
||||
that Windows uses to search for foo.dll. Also, foo.pyd need not be present to
|
||||
run your program, whereas if you linked your program with a dll, the dll is
|
||||
required. Of course, foo.pyd is required if you want to say ``import foo``. In
|
||||
a DLL, linkage is declared in the source code with ``__declspec(dllexport)``.
|
||||
In a .pyd, linkage is defined in a list of available functions.
|
||||
|
||||
|
||||
How can I embed Python into a Windows application?
|
||||
--------------------------------------------------
|
||||
|
||||
Embedding the Python interpreter in a Windows app can be summarized as follows:
|
||||
|
||||
1. Do _not_ build Python into your .exe file directly. On Windows, Python must
|
||||
be a DLL to handle importing modules that are themselves DLL's. (This is the
|
||||
first key undocumented fact.) Instead, link to :file:`python{NN}.dll`; it is
|
||||
typically installed in ``C:\Windows\System``. *NN* is the Python version, a
|
||||
number such as "33" for Python 3.3.
|
||||
|
||||
You can link to Python in two different ways. Load-time linking means
|
||||
linking against :file:`python{NN}.lib`, while run-time linking means linking
|
||||
against :file:`python{NN}.dll`. (General note: :file:`python{NN}.lib` is the
|
||||
so-called "import lib" corresponding to :file:`python{NN}.dll`. It merely
|
||||
defines symbols for the linker.)
|
||||
|
||||
Run-time linking greatly simplifies link options; everything happens at run
|
||||
time. Your code must load :file:`python{NN}.dll` using the Windows
|
||||
``LoadLibraryEx()`` routine. The code must also use access routines and data
|
||||
in :file:`python{NN}.dll` (that is, Python's C API's) using pointers obtained
|
||||
by the Windows ``GetProcAddress()`` routine. Macros can make using these
|
||||
pointers transparent to any C code that calls routines in Python's C API.
|
||||
|
||||
Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe
|
||||
first.
|
||||
|
||||
.. XXX what about static linking?
|
||||
|
||||
2. If you use SWIG, it is easy to create a Python "extension module" that will
|
||||
make the app's data and methods available to Python. SWIG will handle just
|
||||
about all the grungy details for you. The result is C code that you link
|
||||
*into* your .exe file (!) You do _not_ have to create a DLL file, and this
|
||||
also simplifies linking.
|
||||
|
||||
3. SWIG will create an init function (a C function) whose name depends on the
|
||||
name of the extension module. For example, if the name of the module is leo,
|
||||
the init function will be called initleo(). If you use SWIG shadow classes,
|
||||
as you should, the init function will be called initleoc(). This initializes
|
||||
a mostly hidden helper class used by the shadow class.
|
||||
|
||||
The reason you can link the C code in step 2 into your .exe file is that
|
||||
calling the initialization function is equivalent to importing the module
|
||||
into Python! (This is the second key undocumented fact.)
|
||||
|
||||
4. In short, you can use the following code to initialize the Python interpreter
|
||||
with your extension module.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include "python.h"
|
||||
...
|
||||
Py_Initialize(); // Initialize Python.
|
||||
initmyAppc(); // Initialize (import) the helper class.
|
||||
PyRun_SimpleString("import myApp"); // Import the shadow class.
|
||||
|
||||
5. There are two problems with Python's C API which will become apparent if you
|
||||
use a compiler other than MSVC, the compiler used to build pythonNN.dll.
|
||||
|
||||
Problem 1: The so-called "Very High Level" functions that take FILE *
|
||||
arguments will not work in a multi-compiler environment because each
|
||||
compiler's notion of a struct FILE will be different. From an implementation
|
||||
standpoint these are very _low_ level functions.
|
||||
|
||||
Problem 2: SWIG generates the following code when generating wrappers to void
|
||||
functions:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
_resultobj = Py_None;
|
||||
return _resultobj;
|
||||
|
||||
Alas, Py_None is a macro that expands to a reference to a complex data
|
||||
structure called _Py_NoneStruct inside pythonNN.dll. Again, this code will
|
||||
fail in a mult-compiler environment. Replace such code by:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
return Py_BuildValue("");
|
||||
|
||||
It may be possible to use SWIG's ``%typemap`` command to make the change
|
||||
automatically, though I have not been able to get this to work (I'm a
|
||||
complete SWIG newbie).
|
||||
|
||||
6. Using a Python shell script to put up a Python interpreter window from inside
|
||||
your Windows app is not a good idea; the resulting window will be independent
|
||||
of your app's windowing system. Rather, you (or the wxPythonWindow class)
|
||||
should create a "native" interpreter window. It is easy to connect that
|
||||
window to the Python interpreter. You can redirect Python's i/o to _any_
|
||||
object that supports read and write, so all you need is a Python object
|
||||
(defined in your extension module) that contains read() and write() methods.
|
||||
|
||||
How do I keep editors from inserting tabs into my Python source?
|
||||
----------------------------------------------------------------
|
||||
|
||||
The FAQ does not recommend using tabs, and the Python style guide, :pep:`8`,
|
||||
recommends 4 spaces for distributed Python code; this is also the Emacs
|
||||
python-mode default.
|
||||
|
||||
Under any editor, mixing tabs and spaces is a bad idea. MSVC is no different in
|
||||
this respect, and is easily configured to use spaces: Take :menuselection:`Tools
|
||||
--> Options --> Tabs`, and for file type "Default" set "Tab size" and "Indent
|
||||
size" to 4, and select the "Insert spaces" radio button.
|
||||
|
||||
Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs
|
||||
and spaces are causing problems in leading whitespace.
|
||||
You may also run the :mod:`tabnanny` module to check a directory tree
|
||||
in batch mode.
|
||||
|
||||
|
||||
How do I check for a keypress without blocking?
|
||||
-----------------------------------------------
|
||||
|
||||
Use the msvcrt module. This is a standard Windows-specific extension module.
|
||||
It defines a function ``kbhit()`` which checks whether a keyboard hit is
|
||||
present, and ``getch()`` which gets one character without echoing it.
|
Reference in New Issue
Block a user