Python Ctypes-加载dll时抛出OSError:[WinError 193]%1不是有效的Win32应用程序

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

我尝试运行一个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 <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,…)但实际上不是的内容时,会发生此错误。当遇到这种情况时,有多种情况(谷歌搜索错误,会产生很多结果)

当从文件加载图像时(现有且可读,否则错误会有所不同-查看答案末尾的一个项目符号),可能会发生这种情况的原因有很多:

  • 已下载,但下载不完整
  • 由于文件系统问题而损坏
  • 被错误地覆盖了
  • 多得多
导致此错误的两个主要用例:

  • 正在尝试运行不是.exe()的文件
  • 正在尝试在进程中加载.dll(运行.exe)这是我将重点关注的问题
  • 下面是一个虚拟可执行文件试图加载.dll的示例

    代码0.c:

    #包括
    #包括
    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
    在上述两种情况中的任何一种情况下,即使.dll包含有效的映像(对于不同的体系结构),它仍然与当前进程PoV无效。要运行正常,所涉及的两种CPU架构必须匹配(1)

    2.Python上下文 CTypes在加载.dll时做同样的事情:它调用.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()