py2exe 指定子文件夹

2 投票
1 回答
1912 浏览
提问于 2025-05-10 15:41

我想用py2exe把一个.py脚本编译成.exe文件。

文件结构:

ProjectDir
  - src
    - FullGui.py
    - other modules
    - setup.py
  - tools
    - Gui2exe
  - docs

为了符合我的工作流程,我想把setup.py移动到tools文件夹,因为创建.exe文件是一个单独的过程,不是软件部署的一部分。

我使用Gui2exe创建了setup.py。当我在src文件夹中使用它时,一切都运行得很好。

# ======================================================== #
# 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

第一步是把它向上移动一级到ProjectDir。我把script = "FullGui.py"改成了script = "src\FullGui.py",但结果并没有按预期工作。它可以顺利地把.py文件编译成.exe文件,但启动时却中断,并在.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

我尝试通过sys.path.append('src')src添加到路径中,还试着添加了各种路径,但就是找不到它需要的东西。

有没有人能给点提示或解决方案?

相关文章:

  • 暂无相关问题
暂无标签

1 个回答

0

简而言之

setup函数中使用选项 package_dir= { '': '../src' },另外你还可以使用选项 packages 来把你项目里的自定义模块包含进来。


来源

来自 Py2Exe文档

Py2exe扩展了Distutils的设置关键字

Distutils文档 中你可以找到这个选项

package_dir 一个包与目录名称的映射 [一个字典]

详细内容和示例可以在 这里 找到。

撰写回答