python - python 无法在 64 位 Windows 上加载 64 位 DLL
问题描述
我正在测试一个调用底层 DLL 库的小型 python 程序。
我的系统是 64 位 windows 7。python 可执行文件是 64 位 Anaconda3 附带的,在 Anaconda 的虚拟环境中启动。
首先引起我注意的是这个python代码
sys.platform
即使对于 AMD64 Arch,也返回 win32,“platform.machine()”似乎返回了更准确的结果。
Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)] on win32
我确实找到了一些讨论这个问题的帖子,比如这个。
然后程序在尝试加载 DLL 文件时失败:
windll.LoadLibrary(realpath(join(_module_location, 'dlh', 'win64', 'I_cant_tell_you_the_name.dll')))
错误信息:
OSError: [WinError 193] %1 is not a valid Win32 application
问题是,为什么 python 不能在 64 位环境下加载 64 位 DLL?在我看来,编译器坚持要加载 32 位 DLL。这是为什么?还是 Anaconda 创建的 venv 仅支持 32 位代码?
不幸的是,我没有用于测试的 32 位 DLL,否则我想看看结果如何。
解决方案
您可以使用Dependency Walker检查发生了什么。它有一个分析功能,可以跟踪所有库加载。
它可以向您显示一些可能的问题:
- Python 是 32 位的,因为执行了错误的版本
- DLL 不知何故是 32 位的
- DLL 依赖于不在路径中的其他 DLL
推荐阅读
- php - 如何防止从其他域重定向到域
- php - PHP - 将新插入的数字相加
- sqlite - 无法删除 SQLite 数据库中的行
- gstreamer - 在 RTMP 流上添加时间叠加的 Gstreamer 问题
- powershell - 使用参数从 Jenkins 管道调用 Powershell
- java - 从 Docker 容器中的 Spring Boot 应用程序下载文件
- python - Python Pandas - 如何使用键的存在来过滤具有包含字典的列的数据框?
- r - glmnet 计算时间差异 - 为什么?
- python - sql python脚本中的列表索引超出范围
- android - 使用 Kotlin 在 Android 应用中禁用复制/粘贴