无法在 Python 中加载共享对象文件 [重复]

Posted

技术标签:

【中文标题】无法在 Python 中加载共享对象文件 [重复]【英文标题】:Cannot load the shared object file in Python [duplicate] 【发布时间】:2021-09-03 16:41:26 【问题描述】:

我正在尝试使用 Python 中的 CDLL 函数加载共享对象文件,如下所示:

from ctypes import *

my_functions = CDLL("./my_functions.dll")

print(type(my_functions))
print(my_functions.square(10))

print("Done")

但出现以下错误:

Traceback (most recent call last):

  File "C:\Users\me\My reserach - spyder\210903_\calling_c_functions.py", line 9, in <module>
    my_functions = CDLL("./my_functions.dll")

  File "C:\Users\me\anaconda3\lib\ctypes\__init__.py", line 381, in __init__
    self._handle = _dlopen(self._name, mode)

OSError: [WinError 193] %1 is not a valid Win32 application

有谁知道是什么导致了这个问题?我只是遵循https://www.journaldev.com/31907/calling-c-functions-from-python 中的程序,但使用.dll 文件而不是.so 文件。说明一下,我使用的是 Windows10 和 Python3.8。


[更新] OSError 已解决,但出现了另一个问题。

我听从了@Yaroslav 的建议,现在我已经在命令提示符上创建了如下所示的 64bit.dll 文件。

C:\Users\Me>call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\VsDevCmd.bat" -arch=x64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.10.1
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
C:\Users\Me\FileLocation>cl.exe /D_USRDL /D_WINDLL my_functions.c /MT /link /DLL /OUT:my_functions.dll /MACHINE:X64

Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30037 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

my_functions.c
Microsoft (R) Incremental Linker Version 14.29.30037.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:my_functions.exe
/DLL
/OUT:my_functions.dll
/MACHINE:X64
my_functions.obj

现在我尝试从 Python 调用这个新的 .dll 文件。这次我没有再收到 OSError 但我仍然收到一个奇怪的错误:

<class 'ctypes.CDLL'>
Traceback (most recent call last):

  File "C:\Users\Me\My reserach - spyder\210903_\calling_c_functions.py", line 12, in <module>
    print(my_functions.square(10))

  File "C:\Users\Me\anaconda3\lib\ctypes\__init__.py", line 394, in __getattr__
    func = self.__getitem__(name)

  File "C:\Users\Me\anaconda3\lib\ctypes\__init__.py", line 399, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))

AttributeError: function 'square' not found

代码中的函数“square”不知何故无法识别。有谁知道是什么导致了这个问题? 我原来的C代码如下:

//Filename: my_functions.c
#include <stdio.h>

int square(int i)
    return i * i; 

【问题讨论】:

我认为有一个单独的类 WinDLL 用于 Windows 库...... @Programmer,感谢您的评论,但我不确定您在暗示什么。你的意思是,我需要以WinDLL而不是DLL的格式加载共享文件? 这个对应之前的帖子:***.com/questions/57187566/… 【参考方案1】:

您必须构建 64 位 dll(请参阅 -arch=x64 和 /MACHINE:X64):

call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat" -arch=x64
     
cl.exe /D_USRDLL /D_WINDLL api.cpp /MT /link /DLL  /OUT:api.dll /MACHINE:X64

【讨论】:

以上是关于无法在 Python 中加载共享对象文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中加载 JSON 作为实际对象,而不是 dict [重复]

从文件中加载对象的 ArrayList [重复]

无法使用熊猫在 python3 中加载 csv 文件

当我在 python 中加载数据帧时出现 UnicodeDecodeError [重复]

无法在 python (3.4) 中加载 dll 文件

在 Python ctypes 中加载共享库期间出现分段错误(核心转储)