无法在 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 [重复]