2012-01-25 71 views
3

我過去多次使用py2exe爲我的python程序創建* .exe文件。不過,這次我收到了一個錯誤。我想我知道這個問題是什麼,但我不知道如何解決它。Python和py2exe - 隱式導入模塊

我有一些子文件夾中的wx.Panels,它可能是一個可變的數量,所以我通過一個函數來找到文件夾中的* .py文件並調用下面的函數來實際導入每個面板。

在正常的蟒蛇中,這個效果很好。但是,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'] 
) 

回答

0

我相信我找到了解決我的問題的方案。在我的setup.py文件,我取代了「包括= []」符合:

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

在我的代碼,我使用「import_module」功能,它用於使用水珠導入內的模塊面板目錄。相反,我對包含的模塊列表進行了硬編碼。

這不是我想要的確切解決方案(我不想硬編碼面板列表),但它似乎工作。除非我發現更好的東西,否則這就是我將繼續使用的東西。