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 MacOS; 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?


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 MacOS; 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 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.  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
