注:我知道正确的解决方案是做到pip install pywin32,然后让一切自动完成,但这里的问题是关于pythoncom的内部 struct .

当达到import pythoncom英里时,它是有效的,但:

  • 在"C:\Python38\Lib\site-packages\pythoncom.py"中,有import pywintypes,但no pywintypes.py或.pyd或.dll存在于site-packages目录中.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())
    

What and where is this (I quote) "magic utility" that redirects to 100?

我不知道在只执行import pythoncom次时,这个实用程序在哪里被调用.

推荐答案

我相信神奇的效用是pywintypes.__import_pywin32_system_module__加上_win32sysloader.

Dll路径为built here(其中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++文件,loads the DLL:

    HINSTANCE hinst = LoadLibraryEx(modName, NULL,
                                    LOAD_LIBRARY_SEARCH_DEFAULT_DIRS |
                                    LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);

最终结果是加载的DLL的路径,它被注册为一个Python模块here:

    # 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__ function to replace itself:

__import_pywin32_system_module__("pywintypes", globals())

最后,从Lib\site-packages\win32\lib作品中导入pywintypes的原因是由于库的pywin32.pth file(根据@Jeronimo的 comments ),path configuration file.这个文件在解释器启动时自动导入,并且那里的路径被添加到导入路径中.

Python相关问答推荐

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

使用numpy提取数据块

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

如何根据参数推断对象的返回类型?

未删除映射表的行

根据二元组列表在pandas中创建新列

通过pandas向每个非空单元格添加子字符串

对所有子图应用相同的轴格式

有没有一种方法可以从python的pussompy比较结果中提取文本?

用砂箱开发Web统计分析

* 动态地 * 修饰Python中的递归函数

为什么常规操作不以其就地对应操作为基础?

在代码执行后关闭ChromeDriver窗口

导入错误:无法导入名称';操作';

使用类型提示进行类型转换

使用polars. pivot()旋转一个框架(类似于R中的pivot_longer)

如何设置nan值为numpy数组多条件

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

以极轴表示的行数表达式?

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?