2

我正在尝试使用 Py2Exe 从 ReviewBoard 的 postreview.py 构建 Windows 可执行文件,因此我的用户无需安装 Python 即可发布审查请求。

我遇到了编译版本找不到任何已注册的 SCM 客户端的问题。我已将其追踪到代码中的以下行:

for ep in pkg_resources.iter_entry_points(group='rbtools_scm_clients'):

这些入口点列在 EGG-INFO\entry_points.txt 中的 RBTools 蛋中。在编译的 exe 中,iter_entry_points() 函数返回一个空列表。

有没有办法通过 Py2Exe 让编译后的 exe 知道这些入口点?或者我是否坚持自定义 postreview(本质上是对入口点进行硬编码)以使其正常工作?

感谢您的任何提示!

4

1 回答 1

1

如果其他人在寻找答案时遇到这个问题,我通过对入口点进行硬编码来让它工作。我必须按如下方式更新load_scmclients()函数:rbtools/clients/__init__.py

import imp
def main_is_frozen():
    return (hasattr(sys, "frozen") or # new py2exe
            hasattr(sys, "importers") # old py2exe
            or imp.is_frozen("__main__")) # tools/freeze

from rbtools.clients.svn import SVNClient
from rbtools.clients.git import GitClient
from rbtools.clients.mercurial import MercurialClient
from rbtools.clients.cvs import CVSClient
from rbtools.clients.perforce import PerforceClient
from rbtools.clients.plastic import PlasticClient
from rbtools.clients.clearcase import ClearCaseClient
from rbtools.clients.bazaar import BazaarClient
def load_scmclients(options):
    global SCMCLIENTS

    SCMCLIENTS = {}

    if not main_is_frozen():
        for ep in pkg_resources.iter_entry_points(group='rbtools_scm_clients'):
            try:
                SCMCLIENTS[ep.name] = ep.load()(options=options)
            except Exception, e:
                logging.error('Could not load SCM Client "%s": %s' % (ep.name, e))
    else:
        temp_clients = {}
        temp_clients['svn'] = SVNClient
        temp_clients['git'] = GitClient
        temp_clients['mercurial'] = MercurialClient
        temp_clients['cvs'] = CVSClient
        temp_clients['perforce'] = PerforceClient
        temp_clients['plastic'] = PlasticClient
        temp_clients['clearcase'] = ClearCaseClient
        temp_clients['bazaar'] = BazaarClient
        for ep in temp_clients:
            try:
                SCMCLIENTS[ep] = temp_clients[ep](options=options)
            except Exception, e:
                logging.error('Could not load SCM Client "%s": %s' % (str(ep), e))
于 2013-10-08T01:14:19.217 回答