5

Twisted と PyGTK に基づく Python アプリがあります。Twisted 自体は zope.interface に依存しており、直接インポートはしていません。

残念ながら、アプリを実行しようとすると、次のエラーがエラー ログに記録されます。

Traceback (most recent call last):
  File "tasks.py", line 4, in <module>
  File "ui\__init__.pyc", line 14, in <module>
  File "twisted\python\log.pyc", line 17, in <module>
ImportError: No module named zope.interface
Traceback (most recent call last):
  File "tasks.py", line 4, in <module>
  File "ui\__init__.pyc", line 14, in <module>
  File "twisted\python\log.pyc", line 17, in <module>
ImportError: No module named zope.interface
Traceback (most recent call last):
  File "tasks.py", line 4, in <module>
  File "ui\__init__.pyc", line 14, in <module>
  File "twisted\python\log.pyc", line 17, in <module>
ImportError: No module named zope.interface

zope.interfaceと のすべての組み合わせをとzopeに追加しようとしましINCLUDESPACKAGESが、そうすると、次のビルド時エラーが発生するだけです。

running py2exe
*** searching for required modules ***
C:\Python26\lib\site-packages\py2exe\build_exe.py:16: DeprecationWarning: the sets module is deprecated
  import sets
Traceback (most recent call last):
  File "setup.py", line 75, in <module>
    'gtk/*.ui'
  File "C:\Python26\lib\distutils\core.py", line 152, in setup
    dist.run_commands()
  File "C:\Python26\lib\distutils\dist.py", line 975, in run_commands
    self.run_command(cmd)
  File "C:\Python26\lib\distutils\dist.py", line 995, in run_command
    cmd_obj.run()
  File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 243, in run
    self._run()
  File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 296, in _run
    self.find_needed_modules(mf, required_files, required_modules)
  File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 1306, in find_needed_modules
    mf.import_hook(f)
  File "C:\Python26\lib\site-packages\py2exe\mf.py", line 719, in import_hook
    return Base.import_hook(self,name,caller,fromlist,level)
  File "C:\Python26\lib\site-packages\py2exe\mf.py", line 136, in import_hook
    q, tail = self.find_head_package(parent, name)
  File "C:\Python26\lib\site-packages\py2exe\mf.py", line 204, in find_head_package
    raise ImportError, "No module named " + qname
ImportError: No module named zope

setup.pyは:

from distutils.core import setup
import py2exe

def find_data_files(source,target,patterns):
    # I've elided this, I doubt it's relevant to the problem
    # ...

INCLUDES = [
    'cairo',
    'pango',
    'pangocairo',
    'atk',
    'gobject',
    'gio',
]

PACKAGES = [
    'encodings',
]

setup(
    name = 'MyApp',
    description = 'My Application',
    version = '1.0',

    windows = [
                  {
                      'script': os.path.join('ui','tasks.py'),
                      'icon_resources': [
                            (1, os.path.join(
                                'ui','data','iconpack.ico'))
                        ],
                  }
              ],

    options = {
                  'py2exe': {
                      'packages': ','.join(PACKAGES),
                      'includes': ','.join(INCLUDES),
                  }
              },

    data_files = find_data_files(
                    'ui', 'ui', [
                        'data/*',
                        'gtk/*.ui'
                    ])

)

これをビルドするためにpy2exeを取得するにはどうすればよいですか?

4

3 に答える 3

23

あなたがこれを解決したかどうか、あるいはあなたに関係があるかどうかはわかりませんが、将来の検索者のために、ここでZope インポートの問題を修正する簡単な方法を見つけました。

具体的には、ディレクトリに空の__init__.pyファイルを追加しますPYTHONDIR/Lib/site-packages/zope

twistedこのセットアップ ファイルを使用して、アプリケーションでこれをテストしました。

#!/usr/bin/env python
'''
File: setup.py
Author: Spencer Rathbun
Date: 07/24/2012
Description: Setup file for py2exe, converts client python script into executable.
'''
from distutils.core import setup
import py2exe

INCLUDES = [
    ''
]

PACKAGES = [
    'twisted'
]

setup(
        name = 'client',
        description = '',
        version = '1.0',

        console = [
            {"script":"client.py",
                "icon_resources":[
                    (1, "c:\python27\DLLs\py.ico")
                    ]
                }
            ],
        zipfile = None,

        options = {"py2exe":
            {"compressed": 1,
                "optimize": 1,
                "ascii": 0,
                "bundle_files": 1,

                "packages": ','.join(PACKAGES),
                "includes": ','.join(INCLUDES),
                }
            }
        )

Py2exe は、Zope に依存するため、これを使用して twisted now の実行可能ファイルを正常に作成できます。

于 2012-07-24T13:39:39.793 に答える
5

私はzope.interface友人 (zope.component など) と同じ問題を抱えていました。具体的には、py2exeパッケージを検索して発見する方法と、パッケージをインストールzopeする方法に問題があります。

zopeは名前空間パッケージであり、その結果、そのサブパッケージを python のパスに追加するために、そのファイルのファンキーなインポート ロジックに依存してい.pthます (「参考文献」を参照)。zope.interface-3.*.*-py2.*-nspkg.pthそれを見てsite-packagesください、あなたは私が何を意味するかを見るでしょう.

py2exeこの種のパッケージを「発見」するのに問題があります。

zope最後に、私が行ったことは、使用していたさまざまなパッケージを標準モジュールのセットアップに手動で再パッケージ化してから再実行することでした。これにより、すべて問題がないことがsite-packagesわかりましpy2exeた。これは PITA ですが、py2exeエッジケースのパッケージングを処理できるようになるまで、および/またはzopeパッケージがpy2exeフレンドリーな方法でパッケージ化されるまでは、できる限りのことです。

于 2011-10-19T05:57:40.477 に答える
3

Windows XP SP3 で py2exe を使用してパッケージを作成する際に、この問題に直面していました。py2exe が依存関係を正しく判断していないことがわかりました。

この問題を解決するために、サードパーティのパッケージをアンインストールし、次の easy_install コマンドを使用してインストールしました

easy_install -Z <your_package_name>

-Z オプションはパッケージの詳細を解凍するため、コンテンツは圧縮されません。ここで py2exe を実行すると、依存関係が正しく検出されます。

お役に立てれば!

于 2013-12-03T19:06:21.517 に答える