4

_namemapper.soテンプレートの生成に Python Cheetah を使用していますが、インストールされているコンパイル済みライブラリを使用できません。Cheetah 2.4.3 を使用して、Python 2.4 がインストールされた CentOS 5.4 で実行しています。_namemapper.soインストール中に作成したファイルをCheetahに使用させることはできません。

Filling conf/asterisk/sip.conf.ect -> conf/asterisk/sip.conf ...
/usr/lib64/python2.4/site-packages/Cheetah/Compiler.py:1508: UserWarning: 
You don't have the C version of NameMapper installed! I'm disabling Cheetah's 
useStackFrames option as it is painfully slow with the Python version of NameMapper. 
You should get a copy of Cheetah with the compiled C version of NameMapper.

NameMapperただし、モジュールのすぐ隣に共有ライブラリがあります。

$ ls -ltr /usr/lib64/python2.4/site-packages/Cheetah/ | grep -i namemap
-rw-r--r-- 1 root root  12376 Jul  1 20:17 NameMapper.py
-rwxr-xr-x 1 root root  36982 Dec  1 09:55 _namemapper.so
-rw-r--r-- 1 root root  12541 Dec  1 09:55 NameMapper.pyc

このディレクトリを に追加しようとしましたが/etc/ld.so.conf.d/python-cheetah.conf_namemapper.so共有ライブラリが見つかりません。

何か案は?

解決した

@alex-b に感謝します。32 ビット マシンで Cheetah をコンパイルし、共有ライブラリを 64 ビット マシンにロードしようとしていたことがわかりました。ああ!

>>> from Cheetah._namemapper import NotFound
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ImportError: /usr/lib/python2.4/site-packages/Cheetah/_namemapper.so: wrong ELF class: ELFCLASS32

次に、次の問題に遭遇しました。

>>> from Cheetah._namemapper import NotFound
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ImportError: /usr/lib/python2.4/site-packages/Cheetah/_namemapper.so: undefined symbol: PyUnicode_FromFormat

Cheetah は Python <= 2.6 ではうまく動作しないことが判明したので、アップグレードします。

4

2 に答える 2

2

straceを使用して、Pythonで使用される検索パスをトレースするために、開いている呼び出しを出力すると便利な場合があります。

例えば。インポートしようとしているモジュールの名前がnamemapperの場合、以下にnamemapperモジュールで検索されたパスを示します。

strace -e open python -c 'import namemapper'

これにより、モジュールが使用されていない理由に関する手がかりが得られる場合があります。

編集:上記のstraceコマンドラインのモジュール名のスペルを修正しました。

于 2010-12-02T01:01:48.160 に答える
2
  1. スクリプトが呼び出されるときに_namemapper.soパスの 1 つにあることを確認してください。sys.path何かが誤って構成されている可能性があります (たとえば、ホーム ディレクトリなどのどこかに別の python がインストールされている可能性があります)。

    import sys
    sys.path
    
  2. ライブラリ自体が実際にロードされている場合は、正しいバージョンかどうかを確認してください。Cheetah は _namemapper (Utils/NameMapper.py:288) から特定の関数を読み込もうとしているようです:

    try:
        from _namemapper import NotFound, valueForKey, valueForName, \
             valueFromSearchList, valueFromFrameOrSearchList, valueFromFrame
        C_VERSION = True
    except:
        C_VERSION = False
    

    これが失敗した場合C_VERSIONは False に設定され、この警告が表示されます。_namemapperこれらのシンボルを自分からインポートしてみてください_namemapper.so。バージョンが間違っている可能性があります。

于 2010-12-02T01:15:18.403 に答える