我看了这里给定的ctypes示例-Beginner,并使用不同的C代码执行了相同的步骤。我已经使用此处提供的C代码构建了一个.dll和.lib:http : //wolfprojects.altervista.org/articles/dll-in-c-for-python/
//test.c
__declspec(dllexport) int sum(int a, int b) {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
在我的wrapper.py中,我有:
import ctypes
testlib = ctypes.CDLL("C:\\Users\\xyz\\Documents\\Python\\test.dll")
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,出现以下错误:
self._handle = _dlopen(self._name,mode)
OSError:[WinError 193]%1不是有效的Win32应用程序
如果我用
testlib = ctypes.LibraryLoader("C:\\Users\\xyz\\Documents\\Python\\test.dll")
Run Code Online (Sandbox Code Playgroud)
那么我在运行脚本时没有任何错误。但是,如果我尝试这样做:
testlib.sum(3,4)
Run Code Online (Sandbox Code Playgroud)
我得到错误:
dll = self._dlltype(名称)
TypeError:“ str”对象不可调用
dll和.py位于同一文件夹中。谁能帮助我了解这里的情况。我花了数小时试图弄清楚这一点,但是碰壁了。谢谢。
确保您的编译器和 Python 版本都是 32 位或都是 64 位。你不能混合,这就是OSError: [WinError 193] %1 is not a valid Win32 application.
接下来,确保编译为 C 程序而不是 C++。这就是您的答案中提到名称混淆的原因。
示例(注意编译器适用于x86而不是x64:
C:\>cl /LD /W4 test.c
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.c
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.dll
/dll
/implib:test.lib
test.obj
Creating library test.lib and object test.exp
Run Code Online (Sandbox Code Playgroud)
现在使用32 位Python:
C:\>py -2
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> lib = CDLL('test')
>>> lib.sum(2,3)
5
Run Code Online (Sandbox Code Playgroud)
如果您编译为 C++,您仍然可以通过将它们导出为 C 来调用函数,这可以防止 C++ 名称修改:
//test.cpp
extern "C" __declspec(dllexport) int sum(int a, int b) {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8766 次 |
| 最近记录: |