在trac上使用mercurial时,在demandimport中获取“DLL加载失败”或python异常,这次是在Windows 2008 R2上,64位

时间:2012-06-25 16:35:52

标签: python apache mercurial mod-wsgi

This question,在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下,人们应该只使用mercurial的纯python版本。基础Python和mercurial实现的原因,也是很好的了解。

  2. 似乎Mercurial看起来阴暗的需求加载功能,这是一个源代码级别的功能,这让我感到困惑,我希望有人可以解释它。

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

  4. 以下是我使用的测试脚本,它在命令提示符下工作正常,并显示此python 2.6实例在site-packages中有一组可行的Mercurial内容:

    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内部Apache内部运行时,加载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'
    

    上述异常可以修复,奇怪的是“注释掉”整个需求导入单元。这是我的null“pass”实现:

    # 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文件。这似乎对某些人有用,而对于某些人来说,在apache下使用mod_wsgi时,而不是在交互式使用Python时,或通过独立的http hg serve操作时,会失败。我看过Trac Mercurial插件的作者建议解压库.zip。这是我的第一个问题; Library.zip发生了什么,这是我的问题。

    2. 很多人都很难在Windows上从Apache内部运行Python 2.6或2.7,mod_wsgi,Trac和Mercurial。他们所遇到的根本问题似乎远远超出了软件用户和安装人员的解决能力,并且需要一些神秘的,或至少是基本的python编程知识才能解决。

    3. 这就是为什么我在这里问一个关于编程答案网站的问题。我想了解流行的开源软件包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。

1 个答案:

答案 0 :(得分:0)

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

解决方案:

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

B中。去寻找纯粹的100%-python(没有CPython二进制扩展)版本的Mercurial,例如hackable mercurial:

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