Python Ctypes-加载dll时抛出OSError:[WinError 193]%1不是有效的Win32应用程序
我尝试运行一个python代码示例,该代码使用ctypes从库中获取函数。可以找到这个例子。我遵循了指令,除了一个小的修改之外,我使用了完全相同的代码。我一直试图在Windows 10(64位)和python 3.7(64位)上运行此功能,但收到以下错误消息:Python Ctypes-加载dll时抛出OSError:[WinError 193]%1不是有效的Win32应用程序,python,c,windows,dll,ctypes,Python,C,Windows,Dll,Ctypes,我尝试运行一个python代码示例,该代码使用ctypes从库中获取函数。可以找到这个例子。我遵循了指令,除了一个小的修改之外,我使用了完全相同的代码。我一直试图在Windows 10(64位)和python 3.7(64位)上运行此功能,但收到以下错误消息: Traceback (most recent call last): File "C:/Users/gifr9302/PycharmProjects/testpytoc/myfunc.py", line 128, in <mod
Traceback (most recent call last):
File "C:/Users/gifr9302/PycharmProjects/testpytoc/myfunc.py", line 128, in <module>
libmyfunc = npct.load_library('myfunc.dll', os.path.dirname(os.path.abspath(__file__)))
File "C:\Users\gifr9302\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\ctypeslib.py", line 152, in load_library
return ctypes.cdll[libpath]
File "C:\Users\gifr9302\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 431, in __getitem__
return getattr(self, name)
File "C:\Users\gifr9302\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 426, in __getattr__
dll = self._dlltype(name)
File "C:\Users\gifr9302\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 356, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 n’est pas une application Win32 valide
回溯(最近一次呼叫最后一次):
文件“C:/Users/gifr9302/PycharmProjects/testpytoc/myfunc.py”,第128行,在
libmyfunc=npct.load_库('myfunc.dll',os.path.dirname(os.path.abspath(u文件_u)))
文件“C:\Users\gifr9302\AppData\Local\Programs\Python\37\lib\site packages\numpy\ctypeslib.py”,第152行,在加载库中
返回ctypes.cdll[libpath]
文件“C:\Users\gifr9302\AppData\Local\Programs\Python\Python37\lib\ctypes\\uuuuuu init\uuuuuuu.py”,第431行,在uuu getitem中__
返回getattr(self,name)
文件“C:\Users\gifr9302\AppData\Local\Programs\Python\Python37\lib\ctypes\\uuuuuu init\uuuuuu.py”,第426行,位于__
dll=self.\u dlltype(名称)
文件“C:\Users\gifr9302\AppData\Local\Programs\Python37\lib\ctypes\\ uuuuu init\uuuu.py”,第356行,在\uuu init中__
self.\u handle=\u dlopen(self.\u名称,模式)
OSError:[WinError 193]%1不适用于应用程序Win32 valide
翻译成:
操作错误:[WinError 193]%1不是有效的Win32应用程序
我试图创建一个dll而不是so文件,但仍然得到了相同的错误。它似乎试图在64位系统上运行32位应用程序,但我不知道为什么。有人能帮忙吗?只是为了以防万一而提及(尽管这与此无关)
基本错误是错误错误错误EXE格式(193,0xC1)。登记。这是一个常规Win错误(与Python无关)。在当前情况下(与Python相关),异常是它上面的(Python)包装器
1.错误
错误消息令人困惑(特别是因为%1占位符)。有关这方面的更多详细信息,请查看
当Win试图加载它认为是可执行(PE)映像(.exe,.dll,…)但实际上不是的内容时,会发生此错误。当遇到这种情况时,有多种情况(谷歌搜索错误,会产生很多结果)
当从文件加载图像时(现有且可读,否则错误会有所不同-查看答案末尾的一个项目符号),可能会发生这种情况的原因有很多:
- 已下载,但下载不完整
- 由于文件系统问题而损坏
- 被错误地覆盖了
- 多得多
#包括
#包括
int main(){
DWORD gle=0;
HMODULE hMod=LoadLibraryA(“.\\dll0.dll”);
如果(hMod==NULL){
gle=GetLastError();
printf(“加载库失败:%d(0x%08X)\n”,gle,gle);
}否则{
免费图书馆;
}
返回gle;
}
输出:
- 注意:我将重用这个cmd控制台,即使复制/粘贴片段会分散在整个答案中
作为旁注,我不知道为什么这个片段会一团糟(与其他片段相反),我发现最好的(不完美的)解决方法是将它分成3部分
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057187566]>sopr.bat
***设置较短的提示,以便粘贴到StackOverflow(或其他)页面时更适合***
[提示]>“c:\Install\pc032\Microsoft\VisualStudioCommunity\2017\VC\Auxiliary\Build\vcvarsall.bat”x64
**********************************************************************
**Visual Studio 2017开发者命令提示符v15.9.22
**版权所有(c)2017微软公司
**********************************************************************
[vcvarsall.bat]环境已初始化为:“x64”
[prompt]>dir/b
代码0.c
dll0.c
脚本0.py
[提示]>cl/nologo code0.c/link/nologo/OUT:code0_064.exe
代码0.c
[提示]>::创建无效的dll
[提示]>echo垃圾>dll0.dll
[提示]>dir/b
代码0.c
代码0.obj
代码0_064.exe
dll0.c
dll0.dll
脚本0.py
[提示]>code0_064.exe
LoadLibrary失败:193(0x000000C1)
如图所示,我创建了一个包含文本“垃圾”的文件dll0.dll,因此它是一个包含无效内容的.dll文件
此错误最常见的情况是架构不匹配:
- 64位进程试图加载32位.dll
- 32位进程试图加载64位.dll
这与Python进程的情况完全相同,在Python进程中,CTypes试图加载.dll script0.py:
#/usr/bin/env蟒蛇3
导入系统
导入操作系统
导入ctypes
DLL_BASE_NAME=“dll0”
def主(args):
dll_name=os.path.join(os.path.abspath(os.path.dirname(_文件__)),(args[0]如果args else dll_BASE_name)+“.dll”)
打印(“正在尝试加载:[{0:s}]”。格式(dll_名称))
dll0=ctypes.CDLL(dll\u名称)
func0=dll0.dll0Func0
func0.restype=ctypes.c_int
res=func0()
打印(“{0:s}返回{1:d}”。格式(func0.\uuuu name\uuuuu,res))
如果名称=“\uuuuu main\uuuuuuuu”:
在{2:s}\n.format(“.”)上打印(“Python{0:s}{1:d}位”。对于s中的项,连接(item.strip()