py2exe specifying subfolder

我怕爱的太早我们不能终老 提交于 2020-01-04 05:34:36

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!