“import pythoncom”如何找到正确的文件?

问题描述 投票:0回答:1

注意:我知道正确的解决方案就是执行

pip install pywin32
并让一切自动完成,但这里的问题是关于
pythoncom
的内部结构。

当做

import pythoncom
时,它有效,但是:

  • 在“C:\Python38\Lib\site-packages\pythoncom.py”中,有

    import pywintypes
    ,但site-packages目录中不存在pywintypes.py
    或.pyd或.dll。它怎么能“神奇”地找到
    pywintypes

  • 当做

    print(pythoncom.__file__)

    时,我们看到:

    'C:\\Python38\\lib\\site-packages\\pywin32_system32\\pythoncom38.dll'
    这种令人惊叹的行为在内部是如何实现的? (即我们导入的 pythoncom.py 现在被识别为另一个文件,.dll)

  • 另外,

    pythoncom.py

    包含:

    # Magic utility that "redirects" to pythoncomxx.dll import pywintypes pywintypes.__import_pywin32_system_module__("pythoncom", globals())
    
    

这个(我引用的)重定向到pythoncomxx.dll

的“神奇实用程序”是什么以及在哪里?

仅执行

import pythoncom

 操作时,我看不到该实用程序在哪里被调用。

python windows python-import pywin32 pth
1个回答
0
投票
我相信神奇的效用是

pywintypes.__import_pywin32_system_module__

_win32sysloader
的结合。

DLL 路径

在此构建(其中 modname 为“pythoncom”):

suffix = "_d" if "_d.pyd" in importlib.machinery.EXTENSION_SUFFIXES else "" filename = "%s%d%d%s.dll" % ( modname, sys.version_info[0], sys.version_info[1], suffix, )
它被传递给

_win32sysloader

found = _win32sysloader.LoadModule(filename)
这是一个 C++ 文件,

加载 DLL:

HINSTANCE hinst = LoadLibraryEx(modName, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
最终结果是加载的DLL的路径,它被注册为Python模块

这里

# Load the DLL. loader = importlib.machinery.ExtensionFileLoader(modname, found) spec = importlib.machinery.ModuleSpec(name=modname, loader=loader, origin=found) mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod)
至于为什么是pywintypes,应该在

Lib/site-packages/win32/lib/pywintypes.py

下。但如果你真正导入它,你会得到另一个 DLL 路径:

>>> import pywintypes >>> sys.modules['pywintypes'] <module 'pywintypes' (C:\Python312\Lib\site-packages\pywin32_system32\pywintypes312.dll)>
但那是因为 

pywintypes

 使用自己的 
__import_pywin32_system_module__
 函数来替换自己
:

__import_pywin32_system_module__("pywintypes", globals())
    
© www.soinside.com 2019 - 2024. All rights reserved.