问题
I want use py2exe to compile a .py script to an exe.
Filestructure:
ProjectDir
- src
- FullGui.py
- other modules
- setup.py
- tools
- Gui2exe
- docs
To meet my typical workflow, I want to move the setup.py (eg. to tools
because creation of .exe is a seperate process and not part of the software deployed).
I created the setup.py using Gui2exe. When I use it in my src
folder, it works flawless.
# ======================================================== #
# File automagically generated by GUI2Exe version 0.5.3
# Copyright: (c) 2007-2012 Andrea Gavana
# ======================================================== #
# Let's start with some default (for me) imports...
from distutils.core import setup
from py2exe.build_exe import py2exe
import glob
import os
import zlib
import shutil
# Remove the build folder
shutil.rmtree("build", ignore_errors=True)
class Target(object):
""" A simple class that holds information on our executable file. """
def __init__(self, **kw):
""" Default class constructor. Update as you need. """
self.__dict__.update(kw)
# Ok, let's explain why I am doing that.
# Often, data_files, excludes and dll_excludes (but also resources)
# can be very long list of things, and this will clutter too much
# the setup call at the end of this file. So, I put all the big lists
# here and I wrap them using the textwrap module.
data_files = []
includes = []
excludes = ['Tkconstants', 'Tkconstants', 'Tkinter', 'Tkinter', '_gtkagg',
'_gtkagg', '_tkagg', '_tkagg', 'bsddb', 'bsddb',
'curses', 'curses', 'email', 'email', 'pywin.debugger',
'pywin.debugger', 'pywin.debugger.dbgcon', 'pywin.debugger.dbgcon',
'pywin.dialogs', 'pywin.dialogs', 'tcl', 'tcl']
packages = []
dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll',
'libgobject-2.0-0.dll', 'msvcp90.dll', 'msvcp90.dll',
'tcl84.dll', 'tcl84.dll', 'tk84.dll', 'tk84.dll']
icon_resources = []
bitmap_resources = []
other_resources = []
# This is a place where the user custom code may go. You can do almost
# whatever you want, even modify the data_files, includes and friends
# here as long as they have the same variable name that the setup call
# below is expecting.
import matplotlib
data_files.extend(matplotlib.get_py2exe_datafiles())
# Ok, now we are going to build our target class.
# I chose this building strategy as it works perfectly for me :-D
GUI2Exe_Target_1 = Target(
# what to build
script = "FullGui.py",
icon_resources = icon_resources,
bitmap_resources = bitmap_resources,
other_resources = other_resources,
dest_base = "FullGui",
version = "1.0",
company_name = "Bytec Medizintechnik GmbH",
copyright = "All Rights Reserved",
name = "void",
)
# That's serious now: we have all (or almost all) the options py2exe
# supports. I put them all even if some of them are usually defaulted
# and not used. Some of them I didn't even know about.
setup(
# No UPX or Inno Setup
data_files = data_files,
options = {"py2exe": {"compressed": 2,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"packages": packages,
"dll_excludes": dll_excludes,
"bundle_files": 2,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": '',
}
},
zipfile = None,
console = [],
windows = [GUI2Exe_Target_1],
service = [],
com_server = [],
ctypes_com_server = []
)
# This is a place where any post-compile code may go.
# You can add as much code as you want, which can be used, for example,
# to clean up your folders or to do some particular post-compilation
# actions.
# No post-compilation code added
# And we are done. That's a setup script :-D
First step was to just move it one level up into ProjectDir
. I changed script = "FullGui.py",
to script = "src\FullGui.py",
, but it does not work as expected. It compiles the .py into an .exe just fine, but aborts launch and gives following error in the log file of the exe:
Traceback (most recent call last):
File "FullGui.py", line 7, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "receiver.pyo", line 9, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "serial\__init__.pyo", line 18, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "serial\serialwin32.pyo", line 9, in <module>
File "zipextimporter.pyo", line 98, in load_module
ImportError: MemoryLoadLibrary failed loading win32file.pyd
I tried to add src
to path by sys.path.append('src')
and messed around by adding various path, but i can't get it to find what it needs.
A hint or solution anyone?
回答1:
TL;DR
Use the option package_dir= { '': '../src' }
in the setup
function, aditional you can use the option packages
to include your custom modules inside you project.
Source
From Py2Exe documentation
Py2exe extends Distutils setup keywords
and from the Distutils documentation you can found this option
package_dir A mapping of package to directory names [a dictionary]
In detail with example here
来源:https://stackoverflow.com/questions/33807966/py2exe-specifying-subfolder