Make bootloader fully static -- no more issues with MSVCRT71.DLL! (fix ticket #12)

git-svn-id: http://svn.pyinstaller.org/trunk@164 8dd32b29-ccff-0310-8a9a-9233e24343b1
This commit is contained in:
giovannibajo
2005-10-11 17:34:57 +00:00
parent 93c1324474
commit 16cc34c992
6 changed files with 214 additions and 211 deletions
+5 -4
View File
@@ -33,10 +33,11 @@ if platform.name == "win32":
for mode in "cons", "win":
env = base_env.Copy()
# The DLL runtime must be the same of that used by the python DLL.
# I cannot think of a way to guess it from here, so let's assume
# the user has a non-debug build of Python in his system.
env.Append(CCFLAGS = ["/MD"])
# The bootloader is built as a static executable. We want it
# to be self-contained. Extra care was put in writing it so
# that it does not share objects/memory with python.dll (which
# it loads).
env.Append(CCFLAGS = ["/ML"])
if flavour == "debug":
# No optimizations
+5 -2
View File
@@ -3,12 +3,15 @@
Current changes since PyInstaller 1.0
-------------------------------------
+ Fix problem with incorrect python path detection. Now using distutils.
+ Fix problem with incorrect python path detection. Now using helpers from
distutils.
+ Fix problem with rare encodings introduced in newer Python versions: now all
the encodings are automatically found and included, so this problem should
be gone forever.
+ Add import hook for dnspython (tested with 1.3.4)
+ (Windows) Make single-file packages not depend on MSVCRT71.DLL anymore,
even under Python 2.4. You can eventually ship your programs really as
single-file executables, even when using the newest Python version!
PyInstaller 1.0 (with respect to McMillan's Python Installer 5b5):
+171 -182
View File
@@ -21,7 +21,7 @@
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference" href="mailto:william&#64;hpcf.upr.edu">william&#64;hpcf.upr.edu</a></td></tr>
<tr><th class="docinfo-name">Revision:</th>
<td>94</td></tr>
<td>116</td></tr>
<tr class="field"><th class="docinfo-name">Source URL:</th><td class="field-body">svn://pyinstaller/trunk/doc/source/Manual.rst</td>
</tr>
<tr><th class="docinfo-name">Copyright:</th>
@@ -41,89 +41,88 @@
<li><a class="reference" href="#building-optimized" id="id9" name="id9">Building Optimized</a></li>
<li><a class="reference" href="#a-note-on-using-upx" id="id10" name="id10">A Note on using UPX</a></li>
<li><a class="reference" href="#a-note-on-onefile" id="id11" name="id11">A Note on <tt class="docutils literal"><span class="pre">--onefile</span></tt></a></li>
<li><a class="reference" href="#onefile-and-python-2-4-for-windows-important" id="id12" name="id12"><tt class="docutils literal"><span class="pre">--onefile</span></tt> and Python 2.4 for Windows (<strong>important</strong>)</a></li>
</ul>
</li>
<li><a class="reference" href="#pyinstaller-utilities" id="id13" name="id13">PyInstaller Utilities</a><ul>
<li><a class="reference" href="#archiveviewer" id="id14" name="id14">ArchiveViewer</a></li>
<li><a class="reference" href="#bindepend" id="id15" name="id15">bindepend</a></li>
<li><a class="reference" href="#grabversion-windows" id="id16" name="id16">GrabVersion (Windows)</a></li>
<li><a class="reference" href="#analyzing-dependencies" id="id17" name="id17">Analyzing Dependencies</a></li>
<li><a class="reference" href="#pyinstaller-utilities" id="id12" name="id12">PyInstaller Utilities</a><ul>
<li><a class="reference" href="#archiveviewer" id="id13" name="id13">ArchiveViewer</a></li>
<li><a class="reference" href="#bindepend" id="id14" name="id14">bindepend</a></li>
<li><a class="reference" href="#grabversion-windows" id="id15" name="id15">GrabVersion (Windows)</a></li>
<li><a class="reference" href="#analyzing-dependencies" id="id16" name="id16">Analyzing Dependencies</a></li>
</ul>
</li>
<li><a class="reference" href="#spec-files" id="id18" name="id18">Spec Files</a><ul>
<li><a class="reference" href="#introduction" id="id19" name="id19">Introduction</a></li>
<li><a class="reference" href="#toc-class-table-of-contents" id="id20" name="id20">TOC Class (Table of Contents)</a></li>
<li><a class="reference" href="#target-subclasses" id="id21" name="id21">Target Subclasses</a><ul>
<li><a class="reference" href="#analysis" id="id22" name="id22">Analysis</a></li>
<li><a class="reference" href="#pyz" id="id23" name="id23">PYZ</a></li>
<li><a class="reference" href="#pkg" id="id24" name="id24">PKG</a></li>
<li><a class="reference" href="#exe" id="id25" name="id25">EXE</a></li>
<li><a class="reference" href="#dll" id="id26" name="id26">DLL</a></li>
<li><a class="reference" href="#collect" id="id27" name="id27">COLLECT</a></li>
<li><a class="reference" href="#tree" id="id28" name="id28">Tree</a></li>
<li><a class="reference" href="#spec-files" id="id17" name="id17">Spec Files</a><ul>
<li><a class="reference" href="#introduction" id="id18" name="id18">Introduction</a></li>
<li><a class="reference" href="#toc-class-table-of-contents" id="id19" name="id19">TOC Class (Table of Contents)</a></li>
<li><a class="reference" href="#target-subclasses" id="id20" name="id20">Target Subclasses</a><ul>
<li><a class="reference" href="#analysis" id="id21" name="id21">Analysis</a></li>
<li><a class="reference" href="#pyz" id="id22" name="id22">PYZ</a></li>
<li><a class="reference" href="#pkg" id="id23" name="id23">PKG</a></li>
<li><a class="reference" href="#exe" id="id24" name="id24">EXE</a></li>
<li><a class="reference" href="#dll" id="id25" name="id25">DLL</a></li>
<li><a class="reference" href="#collect" id="id26" name="id26">COLLECT</a></li>
<li><a class="reference" href="#tree" id="id27" name="id27">Tree</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference" href="#when-things-go-wrong" id="id29" name="id29">When Things Go Wrong</a><ul>
<li><a class="reference" href="#finding-out-what-went-wrong" id="id30" name="id30">Finding out What Went Wrong</a><ul>
<li><a class="reference" href="#buildtime-warnings" id="id31" name="id31">Buildtime Warnings</a></li>
<li><a class="reference" href="#getting-debug-messages" id="id32" name="id32">Getting Debug Messages</a></li>
<li><a class="reference" href="#getting-python-s-verbose-imports" id="id33" name="id33">Getting Python's Verbose Imports</a></li>
<li><a class="reference" href="#when-things-go-wrong" id="id28" name="id28">When Things Go Wrong</a><ul>
<li><a class="reference" href="#finding-out-what-went-wrong" id="id29" name="id29">Finding out What Went Wrong</a><ul>
<li><a class="reference" href="#buildtime-warnings" id="id30" name="id30">Buildtime Warnings</a></li>
<li><a class="reference" href="#getting-debug-messages" id="id31" name="id31">Getting Debug Messages</a></li>
<li><a class="reference" href="#getting-python-s-verbose-imports" id="id32" name="id32">Getting Python's Verbose Imports</a></li>
</ul>
</li>
<li><a class="reference" href="#helping-installer-find-modules" id="id34" name="id34">Helping Installer Find Modules</a><ul>
<li><a class="reference" href="#extending-the-path" id="id35" name="id35">Extending the Path</a></li>
<li><a class="reference" href="#listing-hidden-imports" id="id36" name="id36">Listing Hidden Imports</a></li>
<li><a class="reference" href="#extending-a-package-s-path" id="id37" name="id37">Extending a Package's <tt class="docutils literal"><span class="pre">__path__</span></tt></a></li>
<li><a class="reference" href="#changing-runtime-behavior" id="id38" name="id38">Changing Runtime Behavior</a></li>
<li><a class="reference" href="#adapting-to-being-frozen" id="id39" name="id39">Adapting to being &quot;frozen&quot;</a></li>
<li><a class="reference" href="#accessing-data-files" id="id40" name="id40">Accessing Data Files</a></li>
<li><a class="reference" href="#helping-installer-find-modules" id="id33" name="id33">Helping Installer Find Modules</a><ul>
<li><a class="reference" href="#extending-the-path" id="id34" name="id34">Extending the Path</a></li>
<li><a class="reference" href="#listing-hidden-imports" id="id35" name="id35">Listing Hidden Imports</a></li>
<li><a class="reference" href="#extending-a-package-s-path" id="id36" name="id36">Extending a Package's <tt class="docutils literal"><span class="pre">__path__</span></tt></a></li>
<li><a class="reference" href="#changing-runtime-behavior" id="id37" name="id37">Changing Runtime Behavior</a></li>
<li><a class="reference" href="#adapting-to-being-frozen" id="id38" name="id38">Adapting to being &quot;frozen&quot;</a></li>
<li><a class="reference" href="#accessing-data-files" id="id39" name="id39">Accessing Data Files</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference" href="#miscellaneous" id="id41" name="id41">Miscellaneous</a><ul>
<li><a class="reference" href="#pmw-python-mega-widgets" id="id42" name="id42">Pmw -- Python Mega Widgets</a></li>
<li><a class="reference" href="#win9xpopen" id="id43" name="id43">Win9xpopen</a></li>
<li><a class="reference" href="#self-extracting-executables" id="id44" name="id44">Self-extracting executables</a><ul>
<li><a class="reference" href="#one-pass-execution" id="id45" name="id45">One Pass Execution</a></li>
<li><a class="reference" href="#two-pass-execution" id="id46" name="id46">Two Pass Execution</a></li>
<li><a class="reference" href="#miscellaneous" id="id40" name="id40">Miscellaneous</a><ul>
<li><a class="reference" href="#pmw-python-mega-widgets" id="id41" name="id41">Pmw -- Python Mega Widgets</a></li>
<li><a class="reference" href="#win9xpopen" id="id42" name="id42">Win9xpopen</a></li>
<li><a class="reference" href="#self-extracting-executables" id="id43" name="id43">Self-extracting executables</a><ul>
<li><a class="reference" href="#one-pass-execution" id="id44" name="id44">One Pass Execution</a></li>
<li><a class="reference" href="#two-pass-execution" id="id45" name="id45">Two Pass Execution</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference" href="#pyinstaller-archives" id="id47" name="id47">PyInstaller Archives</a><ul>
<li><a class="reference" href="#archives-introduction" id="id48" name="id48">Archives Introduction</a></li>
<li><a class="reference" href="#zlibarchive" id="id49" name="id49"><tt class="docutils literal"><span class="pre">ZlibArchive</span></tt></a></li>
<li><a class="reference" href="#carchive" id="id50" name="id50"><tt class="docutils literal"><span class="pre">CArchive</span></tt></a></li>
<li><a class="reference" href="#pyinstaller-archives" id="id46" name="id46">PyInstaller Archives</a><ul>
<li><a class="reference" href="#archives-introduction" id="id47" name="id47">Archives Introduction</a></li>
<li><a class="reference" href="#zlibarchive" id="id48" name="id48"><tt class="docutils literal"><span class="pre">ZlibArchive</span></tt></a></li>
<li><a class="reference" href="#carchive" id="id49" name="id49"><tt class="docutils literal"><span class="pre">CArchive</span></tt></a></li>
</ul>
</li>
<li><a class="reference" href="#license" id="id51" name="id51">License</a></li>
<li><a class="reference" href="#appendix" id="id52" name="id52">Appendix</a><ul>
<li><a class="reference" href="#mf-py-a-modulefinder-replacement" id="id53" name="id53"><tt class="docutils literal"><span class="pre">mf.py</span></tt>: A Modulefinder Replacement</a><ul>
<li><a class="reference" href="#importtracker" id="id54" name="id54">ImportTracker</a></li>
<li><a class="reference" href="#analyze-one" id="id55" name="id55"><tt class="docutils literal"><span class="pre">analyze_one()</span></tt></a></li>
<li><a class="reference" href="#module-classes" id="id56" name="id56">Module Classes</a></li>
<li><a class="reference" href="#code-scanning" id="id57" name="id57">code scanning</a></li>
<li><a class="reference" href="#hooks" id="id58" name="id58">Hooks</a></li>
<li><a class="reference" href="#warnings" id="id59" name="id59">Warnings</a></li>
<li><a class="reference" href="#cross-reference" id="id60" name="id60">Cross Reference</a></li>
<li><a class="reference" href="#usage" id="id61" name="id61">Usage</a></li>
<li><a class="reference" href="#license" id="id50" name="id50">License</a></li>
<li><a class="reference" href="#appendix" id="id51" name="id51">Appendix</a><ul>
<li><a class="reference" href="#mf-py-a-modulefinder-replacement" id="id52" name="id52"><tt class="docutils literal"><span class="pre">mf.py</span></tt>: A Modulefinder Replacement</a><ul>
<li><a class="reference" href="#importtracker" id="id53" name="id53">ImportTracker</a></li>
<li><a class="reference" href="#analyze-one" id="id54" name="id54"><tt class="docutils literal"><span class="pre">analyze_one()</span></tt></a></li>
<li><a class="reference" href="#module-classes" id="id55" name="id55">Module Classes</a></li>
<li><a class="reference" href="#code-scanning" id="id56" name="id56">code scanning</a></li>
<li><a class="reference" href="#hooks" id="id57" name="id57">Hooks</a></li>
<li><a class="reference" href="#warnings" id="id58" name="id58">Warnings</a></li>
<li><a class="reference" href="#cross-reference" id="id59" name="id59">Cross Reference</a></li>
<li><a class="reference" href="#usage" id="id60" name="id60">Usage</a></li>
</ul>
</li>
<li><a class="reference" href="#iu-py-an-imputil-replacement" id="id62" name="id62"><tt class="docutils literal"><span class="pre">iu.py</span></tt>: An <em>imputil</em> Replacement</a><ul>
<li><a class="reference" href="#importmanager" id="id63" name="id63"><tt class="docutils literal"><span class="pre">ImportManager</span></tt></a></li>
<li><a class="reference" href="#importdirector" id="id64" name="id64"><tt class="docutils literal"><span class="pre">ImportDirector</span></tt></a></li>
<li><a class="reference" href="#pathimportdirector" id="id65" name="id65"><tt class="docutils literal"><span class="pre">PathImportDirector</span></tt></a></li>
<li><a class="reference" href="#owner" id="id66" name="id66"><tt class="docutils literal"><span class="pre">Owner</span></tt></a></li>
<li><a class="reference" href="#packages" id="id67" name="id67">Packages</a></li>
<li><a class="reference" href="#possibilities" id="id68" name="id68">Possibilities</a></li>
<li><a class="reference" href="#compatibility" id="id69" name="id69">Compatibility</a></li>
<li><a class="reference" href="#performance" id="id70" name="id70">Performance</a></li>
<li><a class="reference" href="#limitations" id="id71" name="id71">Limitations</a></li>
<li><a class="reference" href="#id1" id="id72" name="id72">Usage</a></li>
<li><a class="reference" href="#iu-py-an-imputil-replacement" id="id61" name="id61"><tt class="docutils literal"><span class="pre">iu.py</span></tt>: An <em>imputil</em> Replacement</a><ul>
<li><a class="reference" href="#importmanager" id="id62" name="id62"><tt class="docutils literal"><span class="pre">ImportManager</span></tt></a></li>
<li><a class="reference" href="#importdirector" id="id63" name="id63"><tt class="docutils literal"><span class="pre">ImportDirector</span></tt></a></li>
<li><a class="reference" href="#pathimportdirector" id="id64" name="id64"><tt class="docutils literal"><span class="pre">PathImportDirector</span></tt></a></li>
<li><a class="reference" href="#owner" id="id65" name="id65"><tt class="docutils literal"><span class="pre">Owner</span></tt></a></li>
<li><a class="reference" href="#packages" id="id66" name="id66">Packages</a></li>
<li><a class="reference" href="#possibilities" id="id67" name="id67">Possibilities</a></li>
<li><a class="reference" href="#compatibility" id="id68" name="id68">Compatibility</a></li>
<li><a class="reference" href="#performance" id="id69" name="id69">Performance</a></li>
<li><a class="reference" href="#limitations" id="id70" name="id70">Limitations</a></li>
<li><a class="reference" href="#id1" id="id71" name="id71">Usage</a></li>
</ul>
</li>
</ul>
@@ -412,21 +411,11 @@ you shouldn't do setuid root programs using <tt class="docutils literal"><span c
recomend the use of --onefile on setuid programs.</strong></p>
<p><a class="reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id12" id="onefile-and-python-2-4-for-windows-important" name="onefile-and-python-2-4-for-windows-important"><tt class="docutils literal docutils literal"><span class="pre">--onefile</span></tt> and Python 2.4 for Windows (<strong>important</strong>)</a></h2>
<p>Currently, there is an issue when using <tt class="docutils literal"><span class="pre">--onefile</span></tt> with Python 2.4: the
resulting executable will depend on <tt class="docutils literal"><span class="pre">MSVCR71.DLL</span></tt>. This is a standard
Microsoft library which was not present on older Windows (like Win9x), so
you are forced to ship it with your application if you need compatibility
with those operating systems. We plan to fix this issue in a future version
of PyInstaller (consult our <a class="reference" href="http://pyinstaller.hpcf.upr.edu/pyinstaller/roadmap">Roadmap</a> for more information).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id13" id="pyinstaller-utilities" name="pyinstaller-utilities">PyInstaller Utilities</a></h1>
<h1><a class="toc-backref" href="#id12" id="pyinstaller-utilities" name="pyinstaller-utilities">PyInstaller Utilities</a></h1>
<div class="section">
<h2><a class="toc-backref" href="#id14" id="archiveviewer" name="archiveviewer">ArchiveViewer</a></h2>
<h2><a class="toc-backref" href="#id13" id="archiveviewer" name="archiveviewer">ArchiveViewer</a></h2>
<pre class="literal-block">
python ArchiveViewer.py &lt;archivefile&gt;
</pre>
@@ -445,10 +434,10 @@ given, extracted to stdout.</dd>
<dt>Q</dt>
<dd>Quit.</dd>
</dl>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id15" id="bindepend" name="bindepend">bindepend</a></h2>
<h2><a class="toc-backref" href="#id14" id="bindepend" name="bindepend">bindepend</a></h2>
<pre class="literal-block">
python bindepend.py &lt;executable_or_dynamic_library&gt;
</pre>
@@ -459,7 +448,7 @@ follow the chain of dependencies of binary extensions and make sure that all
of them get included in the final package.</p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id16" id="grabversion-windows" name="grabversion-windows">GrabVersion (Windows)</a></h2>
<h2><a class="toc-backref" href="#id15" id="grabversion-windows" name="grabversion-windows">GrabVersion (Windows)</a></h2>
<pre class="literal-block">
python GrabVersion.py &lt;executable_with_version_resource&gt;
</pre>
@@ -478,20 +467,20 @@ how the data is displayed and the structure of the resource itself. So the
easiest thing to do is find an executable that displays the kind of
information you want, grab it's resource and edit it. Certainly easier than
the Version resource wizard in VC++.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id17" id="analyzing-dependencies" name="analyzing-dependencies">Analyzing Dependencies</a></h2>
<h2><a class="toc-backref" href="#id16" id="analyzing-dependencies" name="analyzing-dependencies">Analyzing Dependencies</a></h2>
<p>You can interactively track down dependencies, including getting
cross-references by using <tt class="docutils literal"><span class="pre">mf.py</span></tt>, documented in section <a class="reference" href="#mf-py-a-modulefinder-replacement">mf.py: A modulefinder
Replacement</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id18" id="spec-files" name="spec-files">Spec Files</a></h1>
<h1><a class="toc-backref" href="#id17" id="spec-files" name="spec-files">Spec Files</a></h1>
<div class="section">
<h2><a class="toc-backref" href="#id19" id="introduction" name="introduction">Introduction</a></h2>
<h2><a class="toc-backref" href="#id18" id="introduction" name="introduction">Introduction</a></h2>
<p>Spec files are in Python syntax. They are evaluated by Build.py. A simplistic
spec file might look like this:</p>
<pre class="literal-block">
@@ -524,10 +513,10 @@ and <tt class="docutils literal"><span class="pre">binaries</span></tt>. A <tt c
pure. The <tt class="docutils literal"><span class="pre">EXE</span></tt> is built from the <tt class="docutils literal"><span class="pre">PYZ</span></tt>, the scripts and, in the case of a
single-file deployment, the binaries. In a single-directory deployment, a
directory is built containing a slim executable and the binaries.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id20" id="toc-class-table-of-contents" name="toc-class-table-of-contents">TOC Class (Table of Contents)</a></h2>
<h2><a class="toc-backref" href="#id19" id="toc-class-table-of-contents" name="toc-class-table-of-contents">TOC Class (Table of Contents)</a></h2>
<p>Before you can do much with a spec file, you need to understand the
<tt class="docutils literal"><span class="pre">TOC</span></tt> (Table Of Contents) class.</p>
<p>A <tt class="docutils literal"><span class="pre">TOC</span></tt> appears to be a list of tuples of the form (name, path, typecode).
@@ -672,12 +661,12 @@ the run executables understand are:</p>
becomes possible to factor out common modules, and deploy a project containing
multiple executables with minimal redundancy. You'll need some top level code
in each executable to mount the common <tt class="docutils literal"><span class="pre">PYZ</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id21" id="target-subclasses" name="target-subclasses">Target Subclasses</a></h2>
<h2><a class="toc-backref" href="#id20" id="target-subclasses" name="target-subclasses">Target Subclasses</a></h2>
<div class="section">
<h3><a class="toc-backref" href="#id22" id="analysis" name="analysis">Analysis</a></h3>
<h3><a class="toc-backref" href="#id21" id="analysis" name="analysis">Analysis</a></h3>
<pre class="literal-block">
Analysis(scripts, pathex=None, hookspath=None, excludes=None)
</pre>
@@ -704,10 +693,10 @@ prepended.</dd>
filtered. On Windows, a long list of MS dlls are excluded. On Linux/Unix,
any shared lib in <tt class="docutils literal"><span class="pre">/lib</span></tt> or <tt class="docutils literal"><span class="pre">/usr/lib</span></tt> is excluded.</dd>
</dl>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id23" id="pyz" name="pyz">PYZ</a></h3>
<h3><a class="toc-backref" href="#id22" id="pyz" name="pyz">PYZ</a></h3>
<pre class="literal-block">
PYZ(toc, name=None, level=9)
</pre>
@@ -719,10 +708,10 @@ PYZ(toc, name=None, level=9)
<dt><tt class="docutils literal"><span class="pre">level</span></tt></dt>
<dd>The Zlib compression level to use. If 0, the zlib module is not required.</dd>
</dl>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id24" id="pkg" name="pkg">PKG</a></h3>
<h3><a class="toc-backref" href="#id23" id="pkg" name="pkg">PKG</a></h3>
<p>Generally, you will not need to create your own <tt class="docutils literal"><span class="pre">PKGs</span></tt>, as the <tt class="docutils literal"><span class="pre">EXE</span></tt> will do it for
you. This is one way to include read-only data in a single-file deployment,
however. A single-file deployment including TK support will use this technique.</p>
@@ -742,10 +731,10 @@ uses sensible values. If zlib is not available, no compression is used.</dd>
<dd>If 1, <tt class="docutils literal"><span class="pre">EXTENSIONs</span></tt> and <tt class="docutils literal"><span class="pre">BINARYs</span></tt> will be left out of the <tt class="docutils literal"><span class="pre">PKG</span></tt>, and
forwarded to its container (usually a <tt class="docutils literal"><span class="pre">COLLECT</span></tt>).</dd>
</dl>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id25" id="exe" name="exe">EXE</a></h3>
<h3><a class="toc-backref" href="#id24" id="exe" name="exe">EXE</a></h3>
<pre class="literal-block">
EXE(*args, **kws)
</pre>
@@ -782,19 +771,19 @@ and one for non-ELF platforms (where the run executable is simply renamed, and
expects a <tt class="docutils literal"><span class="pre">exename.pkg</span></tt> in the same directory). Which class becomes available
as <tt class="docutils literal"><span class="pre">EXE</span></tt> is determined by a flag in <tt class="docutils literal"><span class="pre">config.dat</span></tt>. This flag is set to
non-ELF when using <tt class="docutils literal"><span class="pre">Make.py</span> <span class="pre">-n</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id26" id="dll" name="dll">DLL</a></h3>
<h3><a class="toc-backref" href="#id25" id="dll" name="dll">DLL</a></h3>
<p>On Windows, this provides support for doing in-process COM servers. It is not
generalized. However, embedders can follow the same model to build a special
purpose DLL so the Python support in their app is hidden. You will need to
write your own dll, but thanks to Allan Green for refactoring the C code and
making that a managable task.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id27" id="collect" name="collect">COLLECT</a></h3>
<h3><a class="toc-backref" href="#id26" id="collect" name="collect">COLLECT</a></h3>
<pre class="literal-block">
COLLECT(*args, **kws)
</pre>
@@ -809,10 +798,10 @@ COLLECT(*args, **kws)
</dl>
</dd>
</dl>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id28" id="tree" name="tree">Tree</a></h3>
<h3><a class="toc-backref" href="#id27" id="tree" name="tree">Tree</a></h3>
<pre class="literal-block">
Tree(root, prefix=None, excludes=None)
</pre>
@@ -833,16 +822,16 @@ Tree(root, prefix=None, excludes=None)
</dl>
<p>Since a <tt class="docutils literal"><span class="pre">Tree</span></tt> is a <tt class="docutils literal"><span class="pre">TOC</span></tt>, you can also use the exclude technique described above
in the section on <tt class="docutils literal"><span class="pre">TOCs</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id29" id="when-things-go-wrong" name="when-things-go-wrong">When Things Go Wrong</a></h1>
<h1><a class="toc-backref" href="#id28" id="when-things-go-wrong" name="when-things-go-wrong">When Things Go Wrong</a></h1>
<div class="section">
<h2><a class="toc-backref" href="#id30" id="finding-out-what-went-wrong" name="finding-out-what-went-wrong">Finding out What Went Wrong</a></h2>
<h2><a class="toc-backref" href="#id29" id="finding-out-what-went-wrong" name="finding-out-what-went-wrong">Finding out What Went Wrong</a></h2>
<div class="section">
<h3><a class="toc-backref" href="#id31" id="buildtime-warnings" name="buildtime-warnings">Buildtime Warnings</a></h3>
<h3><a class="toc-backref" href="#id30" id="buildtime-warnings" name="buildtime-warnings">Buildtime Warnings</a></h3>
<p>When an <tt class="docutils literal"><span class="pre">Analysis</span></tt> step runs, it produces a warnings file (named <tt class="docutils literal"><span class="pre">warnproject.txt</span></tt>)
in the spec file's directory. Generally, most of these warnings are harmless.
For example, <tt class="docutils literal"><span class="pre">os.py</span></tt> (which is cross-platform) works by figuring out what
@@ -869,18 +858,18 @@ Both <tt class="docutils literal"><span class="pre">exec</span></tt> and <tt cla
is more benign.</p>
<p>Any problem detected here can be handled by hooking the analysis of the module.
See <a class="reference" href="#listing-hidden-imports">Listing Hidden Imports</a> below for how to do it.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id32" id="getting-debug-messages" name="getting-debug-messages">Getting Debug Messages</a></h3>
<h3><a class="toc-backref" href="#id31" id="getting-debug-messages" name="getting-debug-messages">Getting Debug Messages</a></h3>
<p>Setting <tt class="docutils literal"><span class="pre">debug=1</span></tt> on an <tt class="docutils literal"><span class="pre">EXE</span></tt> will cause the executable to put out progress
messages (for console apps, these go to stdout; for Windows apps, these show as
MessageBoxes). This can be useful if you are doing complex packaging, or your
app doesn't seem to be starting, or just to learn how the runtime works.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id33" id="getting-python-s-verbose-imports" name="getting-python-s-verbose-imports">Getting Python's Verbose Imports</a></h3>
<h3><a class="toc-backref" href="#id32" id="getting-python-s-verbose-imports" name="getting-python-s-verbose-imports">Getting Python's Verbose Imports</a></h3>
<p>You can also pass a <tt class="docutils literal"><span class="pre">-v</span></tt> (verbose imports) flag to the embedded Python. This can
be extremely useful. I usually try it even on apparently working apps, just to
make sure that I'm always getting my copies of the modules and no import has
@@ -896,13 +885,13 @@ EXE(..., anal.scripts + [('v', '', 'OPTION')], ...)
</pre>
<p>These messages will always go to <tt class="docutils literal"><span class="pre">stdout</span></tt>, so you won't see them on Windows if
<tt class="docutils literal"><span class="pre">console=0</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id34" id="helping-installer-find-modules" name="helping-installer-find-modules">Helping Installer Find Modules</a></h2>
<h2><a class="toc-backref" href="#id33" id="helping-installer-find-modules" name="helping-installer-find-modules">Helping Installer Find Modules</a></h2>
<div class="section">
<h3><a class="toc-backref" href="#id35" id="extending-the-path" name="extending-the-path">Extending the Path</a></h3>
<h3><a class="toc-backref" href="#id34" id="extending-the-path" name="extending-the-path">Extending the Path</a></h3>
<p>When the analysis phase cannot find needed modules, it may be that the code is
manipulating <tt class="docutils literal"><span class="pre">sys.path</span></tt>. The easiest thing to do in this case is tell <tt class="docutils literal"><span class="pre">Analysis</span></tt>
about the new directory through the second arg to the constructor:</p>
@@ -919,10 +908,10 @@ anal = Analysis(['somedir/myscript.py'],
Makespec.py --paths=path/to/thisdir;path/to/thatdir ...
</pre>
<p>(on *nix, use <tt class="docutils literal"><span class="pre">:</span></tt> as the path separator).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id36" id="listing-hidden-imports" name="listing-hidden-imports">Listing Hidden Imports</a></h3>
<h3><a class="toc-backref" href="#id35" id="listing-hidden-imports" name="listing-hidden-imports">Listing Hidden Imports</a></h3>
<p>Hidden imports are fairly common. These can occur when the code is using
<tt class="docutils literal"><span class="pre">__import__</span></tt> (or, perhaps <tt class="docutils literal"><span class="pre">exec</span></tt> or <tt class="docutils literal"><span class="pre">eval</span></tt>), in which case you will see a warning in
the <tt class="docutils literal"><span class="pre">warnproject.txt</span></tt> file. They can also occur when an extension module uses the
@@ -954,10 +943,10 @@ explicitly imported <tt class="docutils literal"><span class="pre">module1</span
hook mechanism is in the <a class="reference" href="#hooks">Hooks</a> section).</p>
<p>If you successfully hook a publicly distributed module in this way, please send
us the hook so we can make it available to others.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id37" id="extending-a-package-s-path" name="extending-a-package-s-path">Extending a Package's <tt class="docutils literal docutils literal"><span class="pre">__path__</span></tt></a></h3>
<h3><a class="toc-backref" href="#id36" id="extending-a-package-s-path" name="extending-a-package-s-path">Extending a Package's <tt class="docutils literal docutils literal"><span class="pre">__path__</span></tt></a></h3>
<p>Python allows a package to extend the search path used to find modules and
sub-packages through the <tt class="docutils literal"><span class="pre">__path__</span></tt> mechanism. Normally, a package's <tt class="docutils literal"><span class="pre">__path__</span></tt> has
only one entry - the directory in which the <tt class="docutils literal"><span class="pre">__init__.py</span></tt> was found. But
@@ -978,10 +967,10 @@ for an example.</p>
and only the analysis. That is, at runtime <tt class="docutils literal"><span class="pre">win32com.shell</span></tt> is resolved the same
way as <tt class="docutils literal"><span class="pre">win32com.anythingelse</span></tt>, and <tt class="docutils literal"><span class="pre">win32com.__path__</span></tt> knows nothing of <tt class="docutils literal"><span class="pre">../win32comext</span></tt>.</p>
<p>Once in awhile, that's not enough.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id38" id="changing-runtime-behavior" name="changing-runtime-behavior">Changing Runtime Behavior</a></h3>
<h3><a class="toc-backref" href="#id37" id="changing-runtime-behavior" name="changing-runtime-behavior">Changing Runtime Behavior</a></h3>
<p>More bizarre situations can be accomodated with runtime hooks. These are small
scripts that manipulate the environment before your main script runs,
effectively providing additional top-level code to your script.</p>
@@ -1003,10 +992,10 @@ my persistence scheme).</p>
free to do almost anything. One provided hook sets things up so that win32com
can generate modules at runtime (to disk), and the generated modules can be
found in the win32com package.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id39" id="adapting-to-being-frozen" name="adapting-to-being-frozen">Adapting to being &quot;frozen&quot;</a></h3>
<h3><a class="toc-backref" href="#id38" id="adapting-to-being-frozen" name="adapting-to-being-frozen">Adapting to being &quot;frozen&quot;</a></h3>
<p>In most sophisticated apps, it becomes necessary to figure out (at runtime)
whether you're running &quot;live&quot; or &quot;frozen&quot;. For example, you might have a
configuration file that (running &quot;live&quot;) you locate based on a module's
@@ -1016,10 +1005,10 @@ probably want to look for it based on <tt class="docutils literal"><span class="
embedding DLL sets <tt class="docutils literal"><span class="pre">sys.frozen='dll'</span></tt>).</p>
<p>For really advanced users, you can access the <tt class="docutils literal"><span class="pre">iu.ImportManager</span></tt> as
<tt class="docutils literal"><span class="pre">sys.importManager</span></tt>. See <a class="reference" href="#iu-py">iu.py</a> for how you might make use of this fact.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id40" id="accessing-data-files" name="accessing-data-files">Accessing Data Files</a></h3>
<h3><a class="toc-backref" href="#id39" id="accessing-data-files" name="accessing-data-files">Accessing Data Files</a></h3>
<p>In a <tt class="docutils literal"><span class="pre">--onedir</span></tt> distribution, this is easy: pass a list of your data files
(in <tt class="docutils literal"><span class="pre">TOC</span></tt> format) to the <tt class="docutils literal"><span class="pre">COLLECT</span></tt>, and they will show up in the distribution
directory tree. The name in the <tt class="docutils literal"><span class="pre">(name,</span> <span class="pre">path,</span> <span class="pre">'DATA')</span></tt> tuple can be a relative
@@ -1044,29 +1033,29 @@ data = this.extract('mystuff')[1]
<p>to get the contents as a binary string. See <a class="reference" href="http://pyinstaller.hpcf.upr.edu/pyinstaller/browser/trunk/support/unpackTK.py?rev=latest">support/unpackTK.py</a> for an advanced
example (the TCL and TK lib files are in a PKG which is opened in place, and
then extracted to the filesystem).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id41" id="miscellaneous" name="miscellaneous">Miscellaneous</a></h1>
<h1><a class="toc-backref" href="#id40" id="miscellaneous" name="miscellaneous">Miscellaneous</a></h1>
<div class="section">
<h2><a class="toc-backref" href="#id42" id="pmw-python-mega-widgets" name="pmw-python-mega-widgets">Pmw -- Python Mega Widgets</a></h2>
<h2><a class="toc-backref" href="#id41" id="pmw-python-mega-widgets" name="pmw-python-mega-widgets">Pmw -- Python Mega Widgets</a></h2>
<p><a class="reference" href="http://pmw.sourceforge.net/">Pmw</a> comes with a script named <tt class="docutils literal"><span class="pre">bundlepmw</span></tt> in the bin directory. If you follow the
instructions in that script, you'll end up with a module named <tt class="docutils literal"><span class="pre">Pmw.py</span></tt>. Ensure
that Builder finds that module and not the development package.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id43" id="win9xpopen" name="win9xpopen">Win9xpopen</a></h2>
<h2><a class="toc-backref" href="#id42" id="win9xpopen" name="win9xpopen">Win9xpopen</a></h2>
<p>If you're using popen on Windows and want the code to work on Win9x, you'll
need to distribute <tt class="docutils literal"><span class="pre">win9xpopen.exe</span></tt> with your app. On older Pythons with
Win32all, this would apply to Win32pipe and <tt class="docutils literal"><span class="pre">win32popenWin9x.exe</span></tt>. (On yet older
Pythons, no form of popen worked on Win9x).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id44" id="self-extracting-executables" name="self-extracting-executables">Self-extracting executables</a></h2>
<h2><a class="toc-backref" href="#id43" id="self-extracting-executables" name="self-extracting-executables">Self-extracting executables</a></h2>
<p>The ELF executable format (Windows, Linux and some others) allows arbitrary
data to be concatenated to the end of the executable without disturbing its
functionality. For this reason, a <tt class="docutils literal"><span class="pre">CArchive</span></tt>'s Table of Contents is at the end of
@@ -1075,9 +1064,9 @@ end and 'open' the <tt class="docutils literal"><span class="pre">CArchive</span
<p>On other platforms, the archive and the executable are separate, but the
archive is named <tt class="docutils literal"><span class="pre">executable.pkg</span></tt>, and expected to be in the same directory.
Other than that, the process is the same.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<div class="section">
<h3><a class="toc-backref" href="#id45" id="one-pass-execution" name="one-pass-execution">One Pass Execution</a></h3>
<h3><a class="toc-backref" href="#id44" id="one-pass-execution" name="one-pass-execution">One Pass Execution</a></h3>
<p>In a single directory deployment (<tt class="docutils literal"><span class="pre">--onedir</span></tt>, which is the default), all of the
binaries are already in the file system. In that case, the embedding app:</p>
<ul class="simple">
@@ -1090,10 +1079,10 @@ bootstraps the import hooks)</li>
<li>runs all the scripts which are at the top level of the archive</li>
<li>finalizes Python</li>
</ul>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id46" id="two-pass-execution" name="two-pass-execution">Two Pass Execution</a></h3>
<h3><a class="toc-backref" href="#id45" id="two-pass-execution" name="two-pass-execution">Two Pass Execution</a></h3>
<p>There are a couple situations which require two passes:</p>
<ul class="simple">
<li>a <tt class="docutils literal"><span class="pre">--onefile</span></tt> deployment (on Windows, the files can't be cleaned up afterwards
@@ -1129,14 +1118,14 @@ installed from RPM, you need the Python-development RPM). It also overrides
<tt class="docutils literal"><span class="pre">sys.path</span></tt>.</p>
<p>In both cases, while one PyInstaller download can be used with any Python
version, you need to have separate installations for each Python version.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id47" id="pyinstaller-archives" name="pyinstaller-archives">PyInstaller Archives</a></h1>
<h1><a class="toc-backref" href="#id46" id="pyinstaller-archives" name="pyinstaller-archives">PyInstaller Archives</a></h1>
<div class="section">
<h2><a class="toc-backref" href="#id48" id="archives-introduction" name="archives-introduction">Archives Introduction</a></h2>
<h2><a class="toc-backref" href="#id47" id="archives-introduction" name="archives-introduction">Archives Introduction</a></h2>
<p>You know what an archive is: a <tt class="docutils literal"><span class="pre">.tar</span></tt> file, a <tt class="docutils literal"><span class="pre">.jar</span></tt> file, a <tt class="docutils literal"><span class="pre">.zip</span></tt> file. Two kinds
of archives are used here. One is equivalent to a Java <tt class="docutils literal"><span class="pre">.jar</span></tt> file - it allows
Python modules to be stored efficiently and, (with some import hooks) imported
@@ -1145,10 +1134,10 @@ directly. This is a <tt class="docutils literal"><span class="pre">ZlibArchive</
blobs of data. It gets its name from the fact that it can be manipulated easily
from C, as well as from Python. Both of these derive from a common base class,
making it fairly easy to create new kinds of archives.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id49" id="zlibarchive" name="zlibarchive"><tt class="docutils literal docutils literal"><span class="pre">ZlibArchive</span></tt></a></h2>
<h2><a class="toc-backref" href="#id48" id="zlibarchive" name="zlibarchive"><tt class="docutils literal docutils literal"><span class="pre">ZlibArchive</span></tt></a></h2>
<p>A <tt class="docutils literal"><span class="pre">ZlibArchive</span></tt> contains compressed <tt class="docutils literal"><span class="pre">.pyc</span></tt> (or <tt class="docutils literal"><span class="pre">.pyo</span></tt>) files. The Table of Contents
is a marshalled dictionary, with the key (the module's name as given in an
<tt class="docutils literal"><span class="pre">import</span></tt> statement) associated with a seek position and length. Because it is
@@ -1163,10 +1152,10 @@ entry was created from (the <tt class="docutils literal"><span class="pre">__fil
compiled). On a user's box with no source installed, this is not terribly
useful, but if they send you the traceback, at least you can make sense of it.</p>
<p><img alt="ZlibArchiveImage" src="images/ZlibArchive.png" /></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id50" id="carchive" name="carchive"><tt class="docutils literal docutils literal"><span class="pre">CArchive</span></tt></a></h2>
<h2><a class="toc-backref" href="#id49" id="carchive" name="carchive"><tt class="docutils literal docutils literal"><span class="pre">CArchive</span></tt></a></h2>
<p>A <tt class="docutils literal"><span class="pre">CArchive</span></tt> contains whatever you want to stuff into it. It's very much like a
<tt class="docutils literal"><span class="pre">.zip</span></tt> file. They are easy to create in Python and unpack from C code. <tt class="docutils literal"><span class="pre">CArchives</span></tt>
can be appended to other files (like ELF and COFF executables, for example).
@@ -1182,11 +1171,11 @@ file. The name is null terminated. Compression is optional by member.</p>
<tt class="docutils literal"><span class="pre">CArchive</span></tt> as a <tt class="docutils literal"><span class="pre">.zip</span></tt> file, you don't need to worry about this. The type codes
are used by the self-extracting executables.</p>
<p><img alt="CArchiveImage" src="images/CArchive.png" /></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id51" id="license" name="license">License</a></h1>
<h1><a class="toc-backref" href="#id50" id="license" name="license">License</a></h1>
<p>PyInstaller is mainly distributed under the
<a class="reference" href="http://pyinstaller.hpcf.upr.edu/pyinstaller/browser/trunk/doc/LICENSE.GPL?rev=latest">GPL License</a>
but it has an exception such that you can use it to compile commercial products.</p>
@@ -1205,10 +1194,10 @@ words, any modifications to will <em>have</em> to be distributed under GPL.</li>
<p>For updated information or clarification see our
<a class="reference" href="http://pyinstaller.hpcf.upr.edu/pyinstaller/wiki/FAQ">FAQ</a> at <a class="reference" href="http://pyinstaller.hpcf.upr.edu/pyinstaller">PyInstaller</a>
home page: <a class="reference" href="http://pyinstaller.hpcf.upr.edu">http://pyinstaller.hpcf.upr.edu</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h1><a class="toc-backref" href="#id52" id="appendix" name="appendix">Appendix</a></h1>
<h1><a class="toc-backref" href="#id51" id="appendix" name="appendix">Appendix</a></h1>
<div class="sidebar">
<p class="first sidebar-title">You can stop reading here...</p>
<p class="last">... if you are not interested in technical details. This appendix contains
@@ -1216,15 +1205,15 @@ insights of the internal workings of PyInstaller, and you do not need this
information unless you plan to work on PyInstaller itself.</p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id53" id="mf-py-a-modulefinder-replacement" name="mf-py-a-modulefinder-replacement"><tt class="docutils literal docutils literal"><span class="pre">mf.py</span></tt>: A Modulefinder Replacement</a></h2>
<h2><a class="toc-backref" href="#id52" id="mf-py-a-modulefinder-replacement" name="mf-py-a-modulefinder-replacement"><tt class="docutils literal docutils literal"><span class="pre">mf.py</span></tt>: A Modulefinder Replacement</a></h2>
<p>Module <tt class="docutils literal"><span class="pre">mf</span></tt> is modelled after <tt class="docutils literal"><span class="pre">iu</span></tt>.</p>
<p>It also uses <tt class="docutils literal"><span class="pre">ImportDirectors</span></tt> and <tt class="docutils literal"><span class="pre">Owners</span></tt> to partition the import name space.
Except for the fact that these return <tt class="docutils literal"><span class="pre">Module</span></tt> instances instead of real module
objects, they are identical.</p>
<p>Instead of an <tt class="docutils literal"><span class="pre">ImportManager</span></tt>, <tt class="docutils literal"><span class="pre">mf</span></tt> has an <tt class="docutils literal"><span class="pre">ImportTracker</span></tt> managing things.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<div class="section">
<h3><a class="toc-backref" href="#id54" id="importtracker" name="importtracker">ImportTracker</a></h3>
<h3><a class="toc-backref" href="#id53" id="importtracker" name="importtracker">ImportTracker</a></h3>
<p><tt class="docutils literal"><span class="pre">ImportTracker</span></tt> can be called in two ways: <tt class="docutils literal"><span class="pre">analyze_one(name,</span> <span class="pre">importername=None)</span></tt>
or <tt class="docutils literal"><span class="pre">analyze_r(name,</span> <span class="pre">importername=None)</span></tt>. The second method does what modulefinder
does - it recursively finds all the module names that importing name would
@@ -1232,10 +1221,10 @@ cause to appear in <tt class="docutils literal"><span class="pre">sys.modules</s
useful, because it is the only way of answering the question &quot;Who imports
name?&quot; But since it is somewhat unrealistic (very few real imports do not
involve recursion), it deserves some explanation.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id55" id="analyze-one" name="analyze-one"><tt class="docutils literal docutils literal"><span class="pre">analyze_one()</span></tt></a></h3>
<h3><a class="toc-backref" href="#id54" id="analyze-one" name="analyze-one"><tt class="docutils literal docutils literal"><span class="pre">analyze_one()</span></tt></a></h3>
<p>When a name is imported, there are structural and dynamic effects. The dynamic
effects are due to the execution of the top-level code in the module (or
modules) that get imported. The structural effects have to do with whether the
@@ -1247,10 +1236,10 @@ dynamic effects. For example, <tt class="docutils literal"><span class="pre">ana
or <tt class="docutils literal"><span class="pre">[&quot;A.B&quot;,</span> <span class="pre">&quot;A.B.C&quot;]</span></tt> depending on whether the import turns out to be relative or
absolute. In addition, ImportTracker's modules dict will have Module instances
for them.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id56" id="module-classes" name="module-classes">Module Classes</a></h3>
<h3><a class="toc-backref" href="#id55" id="module-classes" name="module-classes">Module Classes</a></h3>
<p>There are Module subclasses for builtins, extensions, packages and (normal)
modules. Besides the normal module object attributes, they have an attribute
imports. For packages and normal modules, imports is a list populated by
@@ -1262,10 +1251,10 @@ it's top-level code executed. That top-level code can do various things so that
when the import of <tt class="docutils literal"><span class="pre">B.C</span></tt> finally occurs, something completely different happens
(from what a structural analysis would predict). But mf can handle this through
it's hooks mechanism.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id57" id="code-scanning" name="code-scanning">code scanning</a></h3>
<h3><a class="toc-backref" href="#id56" id="code-scanning" name="code-scanning">code scanning</a></h3>
<p>Like modulefinder, <tt class="docutils literal"><span class="pre">mf</span></tt> scans the byte code of a module, looking for imports. In
addition, <tt class="docutils literal"><span class="pre">mf</span></tt> will pick out a module's <tt class="docutils literal"><span class="pre">__all__</span></tt> attribute, if it is built as a
list of constant names. This means that if a package declares an <tt class="docutils literal"><span class="pre">__all__</span></tt> list
@@ -1276,10 +1265,10 @@ and can issue warnings when they're found.</p>
import. It recognizes when imports are found at the top-level, and when they
are found inside definitions (deferred imports). Within that, it also tracks
whether the import is inside a condition (conditional imports).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id58" id="hooks" name="hooks">Hooks</a></h3>
<h3><a class="toc-backref" href="#id57" id="hooks" name="hooks">Hooks</a></h3>
<p>In modulefinder, scanning the code takes the place of executing the code
object. <tt class="docutils literal"><span class="pre">mf</span></tt> goes further and allows a module to be hooked (after it has been
scanned, but before analyze_one is done with it). A hook is a module named
@@ -1306,10 +1295,10 @@ trace through PyXML-using code, and I can't believe that it's any easier for
the poor programmer using that package). The <tt class="docutils literal"><span class="pre">hook(mod)</span></tt> (if it exists) is
called before looking at the others - that way it can, for example, test
<tt class="docutils literal"><span class="pre">sys.version</span></tt> and adjust what's in <tt class="docutils literal"><span class="pre">hiddenimports</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id59" id="warnings" name="warnings">Warnings</a></h3>
<h3><a class="toc-backref" href="#id58" id="warnings" name="warnings">Warnings</a></h3>
<p><tt class="docutils literal"><span class="pre">ImportTracker</span></tt> has a <tt class="docutils literal"><span class="pre">getwarnings()</span></tt> method that returns all the warnings
accumulated by the instance, and by the <tt class="docutils literal"><span class="pre">Module</span></tt> instances in its modules dict.
Generally, it is <tt class="docutils literal"><span class="pre">ImportTracker</span></tt> who will accumulate the warnings generated
@@ -1317,19 +1306,19 @@ during the structural phase, and <tt class="docutils literal"><span class="pre">
during the code scan.</p>
<p>Note that by using a hook module, you can silence some particularly tiresome
warnings, but not all of them.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id60" id="cross-reference" name="cross-reference">Cross Reference</a></h3>
<h3><a class="toc-backref" href="#id59" id="cross-reference" name="cross-reference">Cross Reference</a></h3>
<p>Once a full analysis (that is, an <tt class="docutils literal"><span class="pre">analyze_r</span></tt> call) has been done, you can get a
cross reference by using <tt class="docutils literal"><span class="pre">getxref()</span></tt>. This returns a list of tuples. Each tuple
is <tt class="docutils literal"><span class="pre">(modulename,</span> <span class="pre">importers)</span></tt>, where importers is a list of the (fully qualified)
names of the modules importing <tt class="docutils literal"><span class="pre">modulename</span></tt>. Both the returned list and the
importers list are sorted.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id61" id="usage" name="usage">Usage</a></h3>
<h3><a class="toc-backref" href="#id60" id="usage" name="usage">Usage</a></h3>
<p>A simple example follows:</p>
<blockquote>
<pre class="doctest-block">
@@ -1374,11 +1363,11 @@ W: delayed eval hack detected at line 418
&gt;&gt;&gt;
</pre>
</blockquote>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id62" id="iu-py-an-imputil-replacement" name="iu-py-an-imputil-replacement"><span id="iu-py"></span><tt class="docutils literal docutils literal"><span class="pre">iu.py</span></tt>: An <em>imputil</em> Replacement</a></h2>
<h2><a class="toc-backref" href="#id61" id="iu-py-an-imputil-replacement" name="iu-py-an-imputil-replacement"><span id="iu-py"></span><tt class="docutils literal docutils literal"><span class="pre">iu.py</span></tt>: An <em>imputil</em> Replacement</a></h2>
<p>Module <tt class="docutils literal"><span class="pre">iu</span></tt> grows out of the pioneering work that Greg Stein did with <tt class="docutils literal"><span class="pre">imputil</span></tt>
(actually, it includes some verbatim <tt class="docutils literal"><span class="pre">imputil</span></tt> code, but since Greg didn't
copyright it, we won't mention it). Both modules can take over Python's
@@ -1390,9 +1379,9 @@ builtin import and ease writing of at least certain kinds of import hooks.</p>
<p>There is an <tt class="docutils literal"><span class="pre">ImportManager</span></tt> which provides the replacement for builtin import
and hides all the semantic complexities of a Python import request from it's
delegates.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<div class="section">
<h3><a class="toc-backref" href="#id63" id="importmanager" name="importmanager"><tt class="docutils literal docutils literal"><span class="pre">ImportManager</span></tt></a></h3>
<h3><a class="toc-backref" href="#id62" id="importmanager" name="importmanager"><tt class="docutils literal docutils literal"><span class="pre">ImportManager</span></tt></a></h3>
<p><tt class="docutils literal"><span class="pre">ImportManager</span></tt> formalizes the concept of a metapath. This concept implicitly
exists in native Python in that builtins and frozen modules are searched
before <tt class="docutils literal"><span class="pre">sys.path</span></tt>, (on Windows there's also a search of the registry while on
@@ -1406,18 +1395,18 @@ metapath until one succeeds.</p>
It's up to the <tt class="docutils literal"><span class="pre">ImportManager</span></tt> to decide if an import is relative or absolute;
to see if the module has already been imported; to keep <tt class="docutils literal"><span class="pre">sys.modules</span></tt> up to
date; to handle the fromlist and return the correct module object.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id64" id="importdirector" name="importdirector"><tt class="docutils literal docutils literal"><span class="pre">ImportDirector</span></tt></a></h3>
<h3><a class="toc-backref" href="#id63" id="importdirector" name="importdirector"><tt class="docutils literal docutils literal"><span class="pre">ImportDirector</span></tt></a></h3>
<p>An <tt class="docutils literal"><span class="pre">ImportDirector</span></tt> just needs to respond to <tt class="docutils literal"><span class="pre">getmod(name)</span></tt> by returning a module
object or <tt class="docutils literal"><span class="pre">None</span></tt>. As you will see, an <tt class="docutils literal"><span class="pre">ImportDirector</span></tt> can consider name to be
atomic - it has no need to examine name to see if it is dotted.</p>
<p>To see how this works, we need to examine the <tt class="docutils literal"><span class="pre">PathImportDirector</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id65" id="pathimportdirector" name="pathimportdirector"><tt class="docutils literal docutils literal"><span class="pre">PathImportDirector</span></tt></a></h3>
<h3><a class="toc-backref" href="#id64" id="pathimportdirector" name="pathimportdirector"><tt class="docutils literal docutils literal"><span class="pre">PathImportDirector</span></tt></a></h3>
<p>The <tt class="docutils literal"><span class="pre">PathImportDirector</span></tt> subclass manages a list of names - most notably,
<tt class="docutils literal"><span class="pre">sys.path</span></tt>. To do so, it maintains a shadowpath - a dictionary mapping the names
on its pathlist (eg, <tt class="docutils literal"><span class="pre">sys.path</span></tt>) to their associated <tt class="docutils literal"><span class="pre">Owners</span></tt>. (It could do this
@@ -1425,10 +1414,10 @@ directly, but the assumption that sys.path is occupied solely by strings seems
ineradicable.) <tt class="docutils literal"><span class="pre">Owners</span></tt> of the appropriate kind are created as needed (if all
your imports are satisfied by the first two elements of <tt class="docutils literal"><span class="pre">sys.path</span></tt>, the
<tt class="docutils literal"><span class="pre">PathImportDirector</span></tt>'s shadowpath will only have two entries).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id66" id="owner" name="owner"><tt class="docutils literal docutils literal"><span class="pre">Owner</span></tt></a></h3>
<h3><a class="toc-backref" href="#id65" id="owner" name="owner"><tt class="docutils literal docutils literal"><span class="pre">Owner</span></tt></a></h3>
<p>An <tt class="docutils literal"><span class="pre">Owner</span></tt> is much like an <tt class="docutils literal"><span class="pre">ImportDirector</span></tt> but manages a much more concrete piece
of turf. For example, a <tt class="docutils literal"><span class="pre">DirOwner</span></tt> manages one directory. Since there are no
other officially recognized filesystem-like namespaces for importing, that's
@@ -1443,10 +1432,10 @@ consisting of <tt class="docutils literal"><span class="pre">Owners</span></tt>.
namespace.</p>
<p>The rest of the import namespace is covered by treelets, each rooted in a
package module (an <tt class="docutils literal"><span class="pre">__init__.py</span></tt>).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id67" id="packages" name="packages">Packages</a></h3>
<h3><a class="toc-backref" href="#id66" id="packages" name="packages">Packages</a></h3>
<p>To make this work, <tt class="docutils literal"><span class="pre">Owners</span></tt> need to recognize when a module is a package. For a
<tt class="docutils literal"><span class="pre">DirOwner</span></tt>, this means that name is a subdirectory which contains an <tt class="docutils literal"><span class="pre">__init__.py</span></tt>.
The <tt class="docutils literal"><span class="pre">__init__</span></tt> module is loaded and its <tt class="docutils literal"><span class="pre">__path__</span></tt> is initialized with the
@@ -1461,10 +1450,10 @@ module name, not the package name or the fully qualified name. And that's
exactly what it gets. (In a flat namespace - like most archives - it is
perfectly easy to route the request back up the package tree to the archive
<tt class="docutils literal"><span class="pre">Owner</span></tt>, qualifying the name at each step.)</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id68" id="possibilities" name="possibilities">Possibilities</a></h3>
<h3><a class="toc-backref" href="#id67" id="possibilities" name="possibilities">Possibilities</a></h3>
<p>Let's say we want to import from zip files. So, we subclass <tt class="docutils literal"><span class="pre">Owner</span></tt>. The
<tt class="docutils literal"><span class="pre">__init__</span></tt> method should take a filename, and raise a <tt class="docutils literal"><span class="pre">ValueError</span></tt> if the file is
not an acceptable <tt class="docutils literal"><span class="pre">.zip</span></tt> file, (when a new name is encountered on <tt class="docutils literal"><span class="pre">sys.path</span></tt> or a
@@ -1476,28 +1465,28 @@ lines of code all told for my own archive format, including initializing a pack
age with it's <tt class="docutils literal"><span class="pre">__subimporter__</span></tt>).</p>
<p>Once the new <tt class="docutils literal"><span class="pre">Owner</span></tt> class is registered with <tt class="docutils literal"><span class="pre">iu</span></tt>, you can put a zip file on
<tt class="docutils literal"><span class="pre">sys.path</span></tt>. A package could even put a zip file on its <tt class="docutils literal"><span class="pre">__path__</span></tt>.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id69" id="compatibility" name="compatibility">Compatibility</a></h3>
<h3><a class="toc-backref" href="#id68" id="compatibility" name="compatibility">Compatibility</a></h3>
<p>This code has been tested with the PyXML, mxBase and Win32 packages, covering
over a dozen import hacks from manipulations of <tt class="docutils literal"><span class="pre">__path__</span></tt> to replacing a module
in <tt class="docutils literal"><span class="pre">sys.modules</span></tt> with a different one. Emulation of Python's native import is
nearly exact, including the names recorded in <tt class="docutils literal"><span class="pre">sys.modules</span></tt> and module attributes
(packages imported through <tt class="docutils literal"><span class="pre">iu</span></tt> have an extra attribute - <tt class="docutils literal"><span class="pre">__importsub__</span></tt>).</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id70" id="performance" name="performance">Performance</a></h3>
<h3><a class="toc-backref" href="#id69" id="performance" name="performance">Performance</a></h3>
<p>In most cases, <tt class="docutils literal"><span class="pre">iu</span></tt> is slower than builtin import (by 15 to 20%) but faster than
<tt class="docutils literal"><span class="pre">imputil</span></tt> (by 15 to 20%). By inserting archives at the front of <tt class="docutils literal"><span class="pre">sys.path</span></tt>
containing the standard lib and the package being tested, this can be reduced
to 5 to 10% slower (or, on my 1.52 box, 10% faster!) than builtin import. A bit
more can be shaved off by manipulating the <tt class="docutils literal"><span class="pre">ImportManager</span></tt>'s metapath.</p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id71" id="limitations" name="limitations">Limitations</a></h3>
<h3><a class="toc-backref" href="#id70" id="limitations" name="limitations">Limitations</a></h3>
<p>This module makes no attempt to facilitate policy import hacks. It is easy to
implement certain kinds of policies within a particular domain, but
fundamentally iu works by dividing up the import namespace into independent
@@ -1514,7 +1503,7 @@ syntax for those should be, but <tt class="docutils literal"><span class="pre">_
easy to implement.</p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id72" id="id1" name="id1">Usage</a></h3>
<h3><a class="toc-backref" href="#id71" id="id1" name="id1">Usage</a></h3>
<p>Here's a simple example of using <tt class="docutils literal"><span class="pre">iu</span></tt> as a builtin import replacement.</p>
<blockquote>
<pre class="doctest-block">
@@ -1528,7 +1517,7 @@ easy to implement.</p>
&gt;&gt;&gt;
</pre>
</blockquote>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
<p><a class="reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference reference" href="#pyinstaller-manual">Back to Top</a></p>
</div>
</div>
</div>
@@ -1536,7 +1525,7 @@ easy to implement.</p>
<div class="footer">
<hr class="footer" />
<a class="reference" href="source/Manual.rst">View document source</a>.
Generated on: 2005-09-21 18:11 UTC.
Generated on: 2005-10-11 16:56 UTC.
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
</div>
-13
View File
@@ -328,19 +328,6 @@ recomend the use of --onefile on setuid programs.**
|GOBACK|
``--onefile`` and Python 2.4 for Windows (**important**)
--------------------------------------------------------
Currently, there is an issue when using ``--onefile`` with Python 2.4: the
resulting executable will depend on ``MSVCR71.DLL``. This is a standard
Microsoft library which was not present on older Windows (like Win9x), so
you are forced to ship it with your application if you need compatibility
with those operating systems. We plan to fix this issue in a future version
of |PyInstaller| (consult our Roadmap_ for more information).
|GOBACK|
PyInstaller Utilities
+++++++++++++++++++++
+32 -9
View File
@@ -63,7 +63,7 @@ DECLPROC(PyObject_SetAttrString);
DECLPROC(PyList_New);
DECLPROC(PyList_Append);
DECLPROC(Py_BuildValue);
DECLPROC(PyFile_FromFile);
DECLPROC(PyFile_FromString);
DECLPROC(PyObject_CallFunction);
DECLPROC(PyModule_GetDict);
DECLPROC(PyDict_GetItemString);
@@ -273,7 +273,7 @@ int mapNames(HMODULE dll)
GETPROC(dll, PyList_New);
GETPROC(dll, PyList_Append);
GETPROC(dll, Py_BuildValue);
GETPROC(dll, PyFile_FromFile);
GETPROC(dll, PyFile_FromString);
GETPROC(dll, PyObject_CallFunction);
GETPROC(dll, PyModule_GetDict);
GETPROC(dll, PyDict_GetItemString);
@@ -570,6 +570,8 @@ int importModules()
TOC *ptoc;
PyObject *co;
PyObject *mod;
PyObject *res;
char buf[32];
VS("importing modules from CArchive\n");
@@ -581,8 +583,17 @@ int importModules()
marshaldict = PyModule_GetDict(marshal);
loadfunc = PyDict_GetItemString(marshaldict, "load");
/* Make a Python file object from f_fp */
pyfile = PyFile_FromFile(f_fp, f_archivename, "rb+", 0);
/* Reopen the archive as a Python file. We cannot use PyFile_FromFile
* because that would require this boot-loader and Python DLL to share
* the same libc, while they purposely don't.
*/
fclose(f_fp);
pyfile = PyFile_FromString(f_archivename, "rb");
if (PyErr_Occurred())
{
PyErr_Print();
return -1;
}
/* Iterate through toc looking for module entries (type 'm')
* this is normally just bootstrap stuff (archive and iu)
@@ -593,8 +604,11 @@ int importModules()
{
VS(ptoc->name);
VS("\n");
/* Go to start of Python module (start + 8) and load the code object */
fseek(f_fp, f_pkgstart + ntohl(ptoc->pos) + 8, SEEK_SET);
res = PyObject_CallMethod(pyfile, "seek", "(ii)", f_pkgstart + ntohl(ptoc->pos) + 8, 0);
Py_XDECREF(res);
co = PyObject_CallFunction(loadfunc, "O", pyfile);
mod = PyImport_ExecCodeModule(ptoc->name, co);
@@ -602,19 +616,28 @@ int importModules()
if (mod == NULL) {
FATALERROR("mod is NULL - ");
FATALERROR(ptoc->name);
//return -1;
}
if (PyErr_Occurred())
{
PyErr_Print();
PyErr_Clear();
//FATALERROR("PyErr loading mod - ");
//FATALERROR(ptoc->name);
//return -1;
}
}
ptoc = incrementTocPtr(ptoc);
}
/* Close the file and release the object. */
res = PyObject_CallMethod(pyfile, "close", "()");
Py_XDECREF(res);
Py_DECREF(pyfile);
/* After closing the python file, we can reopen it as normal file. */
f_fp = fopen(f_archivename, "rb");
if (f_fp == NULL) {
VS("Cannot reopen archive: ");
VS(f_archivename);
VS("\n");
}
return 0;
}
+1 -1
View File
@@ -136,7 +136,7 @@ EXTDECLPROC(int, PyObject_SetAttrString, (PyObject *, char *, PyObject *));
EXTDECLPROC(PyObject *, PyList_New, (int));
EXTDECLPROC(int, PyList_Append, (PyObject *, PyObject *));
EXTDECLPROC(PyObject *, Py_BuildValue, (char *, ...));
EXTDECLPROC(PyObject *, PyFile_FromFile, (FILE *, char *, char *, int));
EXTDECLPROC(PyObject *, PyFile_FromString, (char *, char *));
EXTDECLPROC(PyObject *, PyObject_CallFunction, (PyObject *, char *, ...));
EXTDECLPROC(PyObject *, PyModule_GetDict, (PyObject *));
EXTDECLPROC(PyObject *, PyDict_GetItemString, (PyObject *, char *));