1

这个问题是在 2011 年提出的,在不同的操作系统(XP 而不是 WSRV2008R2)上有人有一个非常相似的问题,但公认的解决方案是回到现在古老的 mercurial 版本 1.8。我认为这在 2012 年不是一个好的答案。

我想知道是否有办法让 Apache 2.2 和 Trac 0.12 以及 Mercurial 2.2.2 在 Windows 上运行,并且都在 Apache 下运行。我遇到的问题似乎与 Python 编程相关,并且与 Python 的使用以及 Mercurial 对各种压缩和解压缩模块格式的使用有关。

  1. 似乎要让这一切正常工作,可能需要您从源代码、Windows 上构建 mercurial,或者使用 Mercurial 的“纯 python”版本。我想知道 Python 或 Mercurial 的哪些情况会导致这些问题,这些问题可能需要我运行“纯 Python”。也许一个公认的答案是 Mercurial 是一种古怪的野兽,在 mod_wsgi 下,应该只使用纯 python 版本的 mercurial。底层 Python 和 mercurial 实现的原因也很高兴知道。

  2. 似乎涉及到 Mercurial 看起来阴暗的需求加载功能,这是 mercurial 源代码中的源代码级功能,这让我感到困惑,我希望有人能解释一下。

  3. 在安装了“library.zip”的mercurial版本中使用似乎也在创建一个运行时情况,当我从命令行运行python.exe时mercurial将导入(Windows中的命令提示符,环境和路径设置为它)将被设置,如果我在 apache 内部),但是 Mercurial 的主要 python 单元不会从 apache 内部导入 mod_wsgi。

这是我使用的测试脚本,它在命令提示符下运行良好,并显示此 python 2.6 实例在以下位置具有一组可用的 Mercurial 内容site-packages

from mercurial import ui, hg
path = 'D:/MyHgRepo'
repo = hg.repository(ui.ui(), path)
print path,"Repository info:"
print repr(repo), "object len: ",len(repo)

但是,当从Trac托管在 insideApache的内部运行时,尝试加载 mercurial 模块失败,首先出现一个奇怪的demandimport故障,然后当它被修复时,在 Trac 中没有给出任何理由的情况下静默地进行调试(我将不得不在 trac 源代码中调试以解决最后一点,也许)。Demandimport.py是 site-packages/Mercurial 文件夹中的一个模块。此异常回溯来自 trac.log:

在这两种情况下,它都说Look in the Trac log for more information.——这里的错误信息似乎是问题所在:

Traceback (most recent call last):
  File "build\bdist.win32\egg\trac\loader.py", line 68, in _load_eggs
    entry.load(require=True)
  File "build/bdist.linux-i686/egg/pkg_resources.py", line 1954, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "C:\Program Files\BitNami Trac Stack\python\lib\site-packages\mercurial\demandimport.py", line 114, in _demandimport
    mod = _origimport(name, globals, locals)
  File "build\bdist.win32\egg\trac\mimeview\rst.py", line 155, in <module>
  File "C:\Program Files\BitNami Trac Stack\python\lib\site-packages\mercurial\demandimport.py", line 87, in __getattribute__
    return getattr(self._module, attr)
AttributeError: 'module' object has no attribute 'directives'

可以通过“注释掉”整个需求导入单元来修复上述异常。这是我的空“通过”实现:

# demandimport.py - disabled by warren.

'''
demandimport - disabled in code by warren.
'''

def enable():
    "does nothing"
    pass

def disable():
    "does nothing"
    pass 

上面的 hack 清除了上面可见的异常,使 trac.log 没有错误,但是,在 Trac 中仍然没有可见的 Hg 插件。

通过在互联网上疯狂搜索,我发现:

  1. 安装到 \Python2.6 系统文件夹中的 Windows 的 Mercurial 安装程序会提供一个“Library.zip”,其中不仅包含 .pyc 文件,还包含 .pyd 文件。这似乎对某些人有效,而对某些人则失败,mod_wsgi在 apache 下使用时,而不是在交互式使用 Python 时,或通过独立的 httphg serve操作。我看到 Trac Mercurial Plugin 的作者建议解压缩 library.zip。这是我的第一个问题;Library.zip 发生了什么,这是我的问题。

  2. 很多人很难让 Python 2.6 或 2.7、mod_wsgi、Trac 和 Mercurial 都在 Windows 上的 Apache 内部运行。他们所面临的潜在问题似乎远远超出了软件用户和安装人员的解决能力,并且需要一些晦涩难懂的,或者至少是基本的 Python 编程知识来解决。

这就是我在编程答案网站上问这个问题的原因。我想了解流行的开源软件包 Mercurial、Trac 等使用的 Python 及其库和模块以及站点包架构,以便我可以理解、诊断和调试 Mercurial 2.2 的损坏的 Python 代码库,其中在 mod_wsgi/apache2.2 环境中使用时,在我的系统上不起作用。

我使用的是 Python 2.6 和 Trac 0.12,它们都是由 Bitnami Trac Stack 安装程序安装的。我正在使用通过 mercurial 网站上的 mercurial-2.2-for-x86-for-Python2.6 安装程序安装的 Mercurial 2.2。

4

1 回答 1

0

发生这种情况是因为安装了包含一些 CPython 扩展的二进制文件的 Mercurial 版本无法导入到 Web 服务器 WSGI 或 CGI 或其他 Python-in-apache 技术中使用的 Python 版本。

解决方案:

A. 查找并安装正确版本的 Mercurial 二进制文件(包括 Mercurial 使用的 library.zip 和 CPython 二进制扩展)

B. 选择纯 100%-python(无 CPython 二进制扩展)版本的 Mercurial,例如 hackable mercurial:

https://www.mercurial-scm.org/wiki/HackableMercurial

于 2013-01-22T16:33:41.370 回答