Python и py2exe - имплицитный импорт модулей - PullRequest
3 голосов
/ 25 января 2012

В прошлом я несколько раз использовал py2exe для создания файлов * .exe для моих программ на python.Однако на этот раз я получаю сообщение об ошибке.Я думаю, что знаю, в чем проблема, но я не знаю, как ее решить.

У меня есть несколько wx.Panels в подпапке, и это может быть переменная сумма, поэтому я импортирую их черезфункция, которая находит файлы * .py в папке и вызывает нижеприведенную функцию для фактического импорта каждой панели.

В обычном Python это работает хорошо.Однако py2exe оставляет эти файлы вне.Я предполагаю, что, поскольку они явно не импортированы, py2exe не считает, что они необходимы.Есть ли этому решение?Какой-нибудь вариант в py2exe, о котором я не знаю?

Спасибо!

# module = Module to be imported (string)
# folder = Folder containing the module (string)
def import_module(module, folder=None):
   if folder is None:
      return __import__(module)
   return getattr(__import__('%s.%s' % (folder.replace(os.path.sep, '.'),
      module)), module)


...within some other function...
modules = [import_module(os.path.basename(os.path.splitext(filename)[0]), 'Panels') for filename in glob.glob('Panels//*.py')]

РЕДАКТИРОВАТЬ

Я добавляю пример setup.pyСценарий, который я использовал.Но я использовал, вероятно, 20 различных вариантов и несколько совершенно разных сценариев (что я мог найти в Интернете).Обратите внимание, что одно требование заключается в том, что он полностью содержится в одном исполняемом файле.

from distutils.core import setup
import py2exe

import wxversion
wxversion.select("2.8.12.1")
import wx
import wx.lib.pubsub

includes = []
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
            'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
            'Tkconstants', 'Tkinter']
packages = ['wx.lib.pubsub']
dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll',
                'tk84.dll']

import glob
my_data_files = [('Panels', glob.glob('Panels/*.py'))]

setup(
    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,
    #data_files = my_data_files,
    windows=['Main.py']
)

1 Ответ

0 голосов
/ 26 января 2012

Мне кажется, я нашел решение для моей проблемы. В моем файле setup.py я заменил строку «includes = []» на:

includes = ['Panels.%s' % os.path.basename(os.path.splitext(filename)[0]) for
        filename in glob.glob('Panels//*.py')]

В моем коде, где я использую функцию import_module, он использовал этот глобус для импорта модулей в каталоге Panels. Вместо этого я жестко закодировал список модулей для включения.

Это не точное решение, которое я хотел (я не хочу жестко программировать этот список панелей), но, похоже, оно работает. Если я не найду ничего лучшего, я буду продолжать использовать это.

...