【问题标题】:How can I search and get the directory of a DLL file in python如何在python中搜索并获取DLL文件的目录
【发布时间】:2012-06-15 23:57:57
【问题描述】:

假设我有一个名为banana.dlldll 文件,并且我有一个名为banana.py 的模块,它将使用ctypes 加载banana.dll,并且它们存储在同一目录中,例如c:\Python27\lib 在 Windows 中。

现在我在其他目录(例如 c:\user\desktop )中创建一个名为 testing.py 的新 python 文件,它将导入 banana.py 模块。但是由于当前工作目录是存储testing.py 的目录。所以我需要通过硬编码手动将目录更改为c:\Python27\lib

但是有没有更聪明的方法可以搜索banana.dll 的存储路径?

【问题讨论】:

    标签: python search dll operating-system ctypes


    【解决方案1】:

    试试:

    import banana
    import os.path
    
    module_dirname = os.path.dirname(banana.__file__)
    

    【讨论】:

    • 您实际上是在获取banana.py 的目录名,是吗?如果banana.pybanana.dll 存储在不同的目录中,这仍然有效吗?
    【解决方案2】:

    如果你安装了 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 和其他可能的异常。

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多