3

というdllファイルがあり、をロードするために使用するbanana.dllというモジュールがあり、それらが同じディレクトリに格納されているとします。たとえば、Windows の場合です。banana.pyctypesbanana.dllc:\Python27\lib

ここで、モジュールをインポートするtesting.py他のディレクトリ (たとえば) に呼び出される新しい python ファイルを作成します。ただし、現在の作業ディレクトリはが格納されているディレクトリであるためです。そのため、ハードコーディングしてディレクトリを手動で変更する必要があります。c:\user\desktopbanana.pytesting.pyc:\Python27\lib

banana.dllしかし、保存されているパスを検索できるよりスマートな方法はありますか?

4

2 に答える 2

3

pywin32 がインストールされている場合:

import _win32sysloader
mod = 'banana'
path_to_mod = _win32sysloader.GetModuleFilename(mod) or _win32sysloader.LoadModule(mod)

または

import win32api
mod = 'banana'
path_to_mod = win32api.GetModuleFileName(win32api.LoadLibrary(mod))

pywin32 がない場合は、ctypes を使用して win32 API にアクセスできます。

import ctypes
from ctypes.wintypes import HANDLE, LPWSTR, DWORD

GetModuleFileName = ctypes.windll.kernel32.GetModuleFileNameW
GetModuleFileName.argtypes = HANDLE, LPWSTR, DWORD
GetModuleFileName.restype = DWORD

mod = 'banana'
MAX_PATH = 260
dll = ctypes.CDLL(mod) or ctypes.WINDLL(mod)
buf = ctypes.create_unicode_buffer(MAX_PATH)
GetModuleFileName(dll._handle, buf, MAX_PATH)
path_to_mod = buf.value

WindowsError およびその他の可能な例外を処理することを忘れないでください。

于 2013-05-20T23:22:55.607 に答える
0

試す:

import banana
import os.path

module_dirname = os.path.dirname(banana.__file__)
于 2012-06-13T03:45:51.540 に答える