This message is being sent in response to your message to the Python
documentation maintainers (docs@python.org).  Your message will
be handled by a human, but this message serves to answer the most
common questions sent to this address.

You will only receive this message if it has not been sent to you for
at least three months.

If your question is answered below, you may not receive an additional
message from the documentation maintainers.  If you feel the answers
below are not sufficient and you do not receive an additional response
within a week, please do send a note letting us know that your
question has not been properly answered, and be specific regarding
what additional information you are looking for.


  -Fred


Frequently Asked Questions about the Python Documentation
---------------------------------------------------------

  1.  Can I download HTML/PDF/PostScript versions of the docs?
  2.  Where can I download Python?
  3.  I can't unpack a downloaded copy on Windows; what should I do?
  4.  I can't unpack a downloaded copy on Mac OS; what should I do?
  5.  What can I use Python for?
  6.  How do I use module/function/whatever XXX?
  7.  What about JPython?
  8.  I found a bug in the documentation, who should I tell?
  9.  Can I get an algorithm to do THIS in language THAT?
 10.  How do I decode an XXX file from my email on a YYY computer?
 11.  Acrobat Reader won't print the PDF.  What's wrong?
 12.  Where can I find documentation in my native language?
 13.  Why is Python installed on my computer?


Answers to the Questions
------------------------

  1.  Can I download HTML/PDF/PostScript/<other> versions of the docs?

      Yes.  These are available via the Web and traditional FTP.  For
      Web access to the latest version, see:

	  http://www.python.org/doc/

      For FTP access to the latest version and archives of previous
      versions, see:

          ftp.python.org:/pub/python/doc/

  2.  Where can I download Python?

      You can get Python in source form and as a Windows installer
      from the main Python website.  You can also find information
      about pre-built packages for other platforms there as well.

      Downloading information at the website is at the URL:

          http://www.python.org/download/

      The sources and Windows installer can be downloaded from the FTP
      site as well:

          ftp://ftp.python.org/pub/python/

  3.  I can't unpack a downloaded archive on Windows; what should I do?

      Make sure the archive was saved with the .tgz extension; you may 
      need to watch carefully when telling the browser where to save
      the file, as the default may change the extension to .tar or
      even .exe.

      Once you're sure the file has the right extension, use a recent
      version of WinZip to upack the file (version 7.0 works).  Get
      WinZip from:

	  http://www.winzip.com/

  4.  I can't unpack a downloaded archive on Mac OS; what should I do?

      Stuffit Expander 4.5 (and probably other versions) cannot handle 
      the "tar" archive, although it can decompress it from the .tgz
      file.  Expander Enhancer, which you have to pay for, can handle
      the tar archive.

  5.  What can I use Python for?

      Python is a general purpose programming language.  See the
      Python home page at http://www.python.org/ for more information; 
      introductory material is available at:

	  http://www.python.org/doc/Intros.html

  6.  How do I use module/function/whatever XXX?

      Start by reading the documentation for XXX.  If the
      documentation doesn't make sense or seems incomplete, please
      file a specific bug report to docs@python.org (the
      address you sent your question to).  Otherwise, you probably
      sent your question to the wrong place (which does not preclude
      an answer, if I know it).

      If you're looking for examples or tutorial information on how to
      use a particular Python library component, check the Demo/
      directory of the source distribution or Windows installation;
      there might be an example.  If that doesn't help, point your Web
      browser to http://www.python.org/doc/ and look around; there may
      be a link to some interesting examples online.  After that, try
      searching the Python Web site at http://www.python.org/search/.

      If your question still hasn't been answered, you may send your
      query to the Python newsgroup (comp.lang.python) or the mailing
      list (see http://www.python.org/mailman/listinfo/python-list).
      If you'd rather not send you message to a public forum, you can
      try sending it to python-help@python.org.  (This is typically
      slower than sending your question to the public list, however.)

  7.  What about Jython and JPython?

      If your question is specific to Jython or JPython, you should
      consult the Jython website at:

	  http://www.jython.org/

      Chances are very good that the person who answers questions
      posted to docs@python.org doesn't use Jython very often, 
      and won't be able to give you a meaningful answer beyond "Look
      at the Jython website."  Sorry, I don't have *all* the answers!

  8.  I found a bug in the documentation, who should I tell?

      If you're reading this, you've found the right address!  Send
      all documentation bug reports to docs@python.org.  If
      you prefer to use a Web-based reporting mechanism, you can use
      the bug database at http://www.python.org/python-bugs/.

  9.  Can I get an algorithm to do THIS in language THAT?

      If THAT is Python, look in the standard library.  If THAT isn't
      Python, use your favorite Internet search engine.

 10.  How do I decode an XXX file from my email on a YYY computer?

      I really, honestly do not know.  I don't even know why this
      question gets asked here.  Since I don't have a YYY computer,
      I couldn't even try a few things out for you.

 11.  Acrobat Reader won't print the PDF.  What's wrong?

      Adobe has reportedly admitted that there is a bug in Acrobat Reader
      5.0 which causes it not to print at least some PDF files
      generated by pdfTeX.  This software is used to produce the PDF
      version of the Python documentation, and our documents
      definately trigger this bug in Acrobat Reader.  To print the PDF
      files, use Acrobat Reader 4.x, ghostscript, or xpdf.

      Information on ghostscript can be found at:

          http://www.ghostscript.com/

      Information on xpdf can be found at:

          http://www.foolabs.com/xpdf/

 12.  Where can I find documentation in my native language?

      There is a lot of contributed documentation in languages other
      than English.  Some of the documents are translations of English
      documents, and others were originally authored in other
      languages.  If we know about it, it will be listed at:

          http://www.python.org/doc/NonEnglish.html

 13.  Why is Python installed on my computer?

      We're increasingly seeing Python being installed on computers
      as delivered by vendors.  For more information on why, and
      whether it's safe to remove, see the "Why is Python Installed on
      my Computer?" FAQ, found at:

          http://www.python.org/doc/faq/installed.html
