比方说,如果我有一个dll
文件名为banana.dll
,我有一个模块调用banana.py
将使用ctypes
加载banana.dll
,并将它们存储在同一目录中,〔实施例c:\Python27\lib
的视窗。
现在,我创建一个新的名为Python文件testing.py
在其他目录(例如c:\user\desktop
),这将导入banana.py
模块。 但是,由于当前的工作目录是目录testing.py
存储。 所以,我需要的目录手动更改到c:\Python27\lib
的硬编码。
但没有办法,我可以搜索所在的路径一个更聪明的方式banana.dll
存储?
如果您已经安装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和其他可能的例外。
尝试:
import banana
import os.path
module_dirname = os.path.dirname(banana.__file__)