2016-05-11 15 views
3

私はlibarchiveモジュールをWindowsのpython 3.4で動作させようとしています。 私はピップと作者libarchive-Cをインストールしているし、すべてがOKに行ったが、私は自分のコードにインポートしたり、I'meがエラーを取得だけではそれを実行しようとするたび:WindowsでPythonでlibarchiveを使用する

OSError: [WinError 126] The specified module could not be found 

これはffi.pyから来ています以下のコードから:

libarchive_path = os.environ.get('LIBARCHIVE') or find_library('archive') 
libarchive = ctypes.cdll.LoadLibrary(libarchive_path) 

私は前のctypesを使ったことがないが、私が正しく理解している場合には、外部DLLを探しています。見つけてインストールしましたhttp://gnuwin32.sourceforge.net/packages/libarchive.htm環境変数の%PATH%にC:\ Program Files(x86)\ GnuWin32 \ binを追加しましたが、それでもモジュールをロードできません。それが私に名前を与えないので、私はそれが何のモジュールを探しているのかよく分かりません。 私は何が欠けていますか?

+0

「LIBARCHIVE」環境変数または「archive.dll」からDLL名を探しています。 DLLの名前を変更する代わりに 'LIBARCHIVE'を使うことをお勧めします。 Pythonを実行する前に 'set LIBARCHIVE = libarchive2.dll'を使ってコマンドプロンプトでこれをテストすることができます。これは32ビットのDLLなので、32ビットのPythonを使用する必要があります。 – eryksun

答えて

3

(免責事項)Iはhttps://github.com/Changaco/python-libarchive-cに寄与し、私は両方を含むhttps://github.com/nexB/scancode-toolkit

維持​​スキャンコードのみ抽出するためのものであるが、libarchiveのバインディング。

私の答えはpython-libarchive-cですが、ScanCodeには探しているDLLの一部が含まれていますので、私は両方のビットにひもをつけています。

Windows上でpython-libarchive-cを取得するには、libarchive DLLとそのデプスをロードする必要があります。

python-libarchive-cにバンドルされて何のビルド済みのDLLはありませんが、私はここに別のプロジェクトのためのビルド済みのWindowsバイナリがあります。https://github.com/nexB/scancode-thirdparty-src そして、あなたから再構築したい場合は、そこMinGW32ビルド手順があります。対応するソースコードがある https://github.com/nexB/scancode-toolkit/tree/develop/src/extractcode/bin/win-32/bin を自分でソース:一般的にhttps://github.com/nexB/scancode-thirdparty-src/blob/master/libarchive/build.sh#L47

がパスからDLLをロードするために - VAR libarchiveは、そのDLLへの完全なパスが含まれていることを仮定して - これを使用する: lib = ctypes.CDLL(libarchive) は、今これはスキャンコードのためです。その後、ライブラリをインポート、Pythonのを開始し、それを使用 set LIBARCHIVE="C:\.....\libarchive.dll"

python-libarchive-cために、あなたがあなたのDLLのパスを指すようにLIBARCHIVE変数を設定しようとすることができます。

NB:これはまだテストしていませんが、これはうまくいくはずです。バグを報告しないでください。 私はPython 3.4でもテストを実行しませんでした。私は主にPython 2.7を使用します。 しかし、DLLとコードはPython 2.7固有のものではありません。

FWIW、スキャンコードがライブラリをロードする方法は、従来の場所を使用して特定の32または64ビットのarchに対して同じコードをDLL Win/Linux/Macからロードできるので、より魅力的です。あなたはそこにアクションでコードを見ることができます: https://github.com/nexB/scancode-toolkit/blob/develop/src/extractcode/libarchive2.py#L64

スキャンコードはまだpython-libarchive-c ATMを使用していないが、異なる/カスタムのctypesのみ抽出のより具体的なユースケースに焦点を当てたバインディング。少なくとも、Win DLLとそのdeps(またはそれらをビルドする命令)へのアクセス権と、正しくロードする方法の例を提供します。

/HTH

+0

@ NosIrelandはこれを手に入れることができましたか? –

+0

*** ***私はそれを試しましたが、libarchive.DLLがlibarchive.DLLを見つけられません - cmd.exeに変数LIBARCHIVEを設定しても、 –

+1

モジュールのコードを変更する必要がありました: '_FILEPATH == '': _FILEPATH = ctypes.util.find_library( 'libarchive')_FILEPATHがNoneの場合 : _FILEPATH = 'libarchive.dll' '<* * to * ***。dll *** *の代わりに* **。だから*** –

関連する問題