2011-01-21 36 views
2

私は2つのdllファイルと1つのpythonラッパーからなるライブラリを持っています。python cdllがモジュールを見つけることができません

私は現在、メインのpythonファイルと同じ親ディレクトリにあるこれらの3つのファイルに基づいたコードを持っています。私は開発を続ける前にリファクタリングを試みています。ライブラリのコードを自分のlib /ディレクトリに移動したいと思います。残念ながら、私が試したことは何も役に立ちません。

上記のPythonラッパーファイルにあるコードは、dllを完全に元の場所に読み込みます。しかし、Pythonは常にモジュールを見つけることができないと言って例外がスローされます..私はコピーを持っており、それがであることを確認するためにパスを貼り付け

from ctypes import * 
import os 

path = os.path.dirname(os.path.realpath(__file__)) 
_lib = ctypes.CDLL(os.path.join(path, 'my.dll')) 

:私は、次のような新しい場所でそれをロードするさまざまな方法を試してみました事実、.dllファイルへの有効な絶対パス

このライブラリをサブフォルダに再配置するには、何が必要なのですか?私はいつもそれをそのままにしておくことができましたが、私は単に混乱を嫌うだけです。

+0

をどうなりますか?親ディレクトリはシステムの検索パスにありますか? (あなたはWindowsを使用していますか?どのバージョンですか?そしてどのバージョンのPythonですか?) – Velociraptors

+0

私はWindows 7 x64上でPython 2.7を使用しています。問題のディレクトリは絶対にパス上にありません。なぜそれがパス上にある必要があります必要があります私はそれを呼び出すスクリプトと同じディレクトリに2)私はそれに絶対パスを渡しているので、私は表示されません。今晩あなたの提案の結果を更新して家に戻します。 – jdsmith2816

+0

'find_library()'はシステム検索パスを使います。親ディレクトリ*がパス上にあった場合、dllを移動する前にそれがなぜ機能するのか説明している可能性があります。そうではないので、より多くの情報が役立つかもしれません。 – Velociraptors

答えて

4

を私はmagic1.dllをロードしようとして同じ問題を持っていた - このファイルには、2つの他の.dllのに依存しており、とき私は現在の作業ディレクトリからmagic1.dllを移動しました - 私は読み込めませんでした。

この回避策は助け:あなたは `ctypes.util.find_library( 'dll_nameを')を`しようとした場合

pathToWin32Environment = os.getcwd() + "/environment-win32/libmagic/" 
pathToDll = pathToWin32Environment + "magic1.dll" 
if not os.path.exists(pathToDll): 
    #Give up if none of the above succeeded: 
    raise Exception('Could not locate ' + pathToDll) 
curr_dir_before = os.getcwd() 
os.chdir(pathToWin32Environment) 
libmagic = ctypes.CDLL('magic1.dll') 
os.chdir(curr_dir_before) 
1

確かに正確なエラーメッセージがわかりますが、ctypes.dll(path)が有効ではないようです。

例えば、私は、Python 2.7で、これを取得:

>>> ctypes.dll("kernel32.dll") 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'dll' 

おそらく、あなたの代わりにこのことを意味:

>>> _lib = ctypes.CDLL(os.path.join(path, 'my.dll')) 
+0

はい、申し訳ありません。メモリから2番目のコードブロックをタイプしていました。私は既に他のリファクタリングを続けるためにどのように戻ってきたのか、適切な呼び出しを反映するように編集されました。もし私が今夜後で家に帰ると、正確なエラーメッセージが出るのを助けるが、モジュールを見つけることができなかったと報告していた。 – jdsmith2816

関連する問題