1

この質問は、2011 年に、別のオペレーティング システム (WSRV2008R2 ではなく XP) で尋ねられたもので、非常によく似た問題を抱えている人ですが、受け入れられている解決策は、現在は古い 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」を実行する必要があるかもしれないこれらの問題につながる可能性があります。おそらく、受け入れられている答えの 1 つは、Mercurial は奇抜な獣であり、mod_wsgi の下では、mercurial の純粋な python バージョンのみを使用する必要があるというものです。基礎となる 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内部でホストされている内部から実行Apacheすると、mercurial モジュールをロードしようとすると失敗し、最初は奇妙なdemandimport失敗が発生し、それが修正されると、Trac で理由が指定されずに静かに (問題を解決するには、trac ソースコードでデバッグする必要があります)この最後のビット、おそらく)。Demandimport.pysite-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「パス」実装です:

# demandimport.py - disabled by warren.

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

def enable():
    "does nothing"
    pass

def disable():
    "does nothing"
    pass 

上記のハックにより、上記の目に見える例外がクリアされ、trac.log にエラーがなくなりますが、それでも Trac 内に Hg プラグインは表示されません。

インターネットで大雑把にグーグルで調べたところ、次のことがわかりました。

  1. \Python2.6 システム フォルダにインストールされる Windows 用の Mercurial インストーラは、.pyc だけでなく .pyd ファイルも含む「Library.zip」を出荷します。これは、Python をインタラクティブに使用している場合や、スタンドアロンの http操作mod_wsgiを介して使用している場合ではなく、apache で使用している場合に機能する人もいれば、失敗する人もいます。hg serveTrac Mercurial Plugin の作成者が library.zip の解凍を提案しているのを見たことがあります。これが私の最初の質問です。Library.zip で何が起こっているのか、それは私の問題ですか。

  2. Windows で Python 2.6 または 2.7、mod_wsgi、Trac、および Mercurial をすべて Apache 内から実行するのに苦労している人はたくさんいます。彼らが抱えている根本的な問題は、ソフトウェアユーザーやインストーラーの解決能力をはるかに超えているようであり、解決するには難解な、または少なくとも初歩的な Python プログラミングの知識が必要です。

そのため、プログラミング回答サイトでこの質問をしています。Mercurial 2.2 の壊れた Python コードベースを理解し、診断し、デバッグできるように、Python とそのライブラリ、モジュール、およびサイト パッケージのアーキテクチャを理解したいと考えています。 mod_wsgi/apache2.2 環境で使用すると、私のシステムでは機能しません。

私は Python 2.6 と Trac 0.12 を使用しています。これらはすべて Bitnami Trac Stack インストーラーによってインストールされています。Mercurial Web サイトから 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. Hackable mercurial など、純粋な 100%-python (CPython バイナリ拡張なし) バージョンの Mercurial を使用します。

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

于 2013-01-22T16:33:41.370 に答える