2012-01-25 4 views
3

Pythonプログラムの* .exeファイルを作成するために過去に何回かpy2exeを使用しました。しかし、今回はエラーが出ます。問題の内容を知っていると思いますが、解決方法はわかりません。Pythonとpy2exe - Implicitely importing modules

私はサブフォルダ内にいくつかの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')] 

EDIT

私は私が使用したサンプルのsetup.pyスクリプトを追加しています。しかし、私はおそらく20種類のバリエーションといくつかの全く異なるスクリプト(私はインターネット上で見つけることができます)を使用しました。 1つの要件は、1つの実行可能ファイルに完全に自己完結していることです。

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ファイルでは、私はと「を含む= []」行に置き換え:

私は「import_module」関数を使用し、私のコードで
includes = ['Panels.%s' % os.path.basename(os.path.splitext(filename)[0]) for 
     filename in glob.glob('Panels//*.py')] 

を、それが内のモジュールをインポートすることグロブを使用するために使用されますパネルディレクトリ。代わりに、私はモジュールのリストをハードコードしています。

これは私が欲しかった正確な解決策ではありませんが(私はそのパネルのリストをハードコードしたくありませんが)、うまくいくようです。私が何か良いものを発見しない限り、これは私が引き続き使用するものです。