Python 如何使用cl命令?
总之,我找到了一条关于如何在python中调用c文件的信息,在这些示例中:有一个c文件,其中包括许多其他头文件,这个c文件的最开始是Python 如何使用cl命令?,python,c,compiler-construction,Python,C,Compiler Construction,总之,我找到了一条关于如何在python中调用c文件的信息,在这些示例中:有一个c文件,其中包括许多其他头文件,这个c文件的最开始是#include python.h,然后我发现#include python.h实际上涉及许多其他头文件,例如pystate.h,object.h,等等,所以我包含了所有必需的头文件。在CPPIDE环境中,它没有显示错误。我想做的是在python中调用这个c代码,所以从ctypes import*中,然后似乎应该通过以下代码生成dll,例如:cl-LD test.c
#include python.h
,然后我发现#include python.h
实际上涉及许多其他头文件,例如pystate.h
,object.h
,等等,所以我包含了所有必需的头文件。在CPPIDE环境中,它没有显示错误。我想做的是在python中调用这个c代码,所以从ctypes import*中,然后似乎应该通过以下代码生成dll
,例如:cl-LD test.c-test.dll
,但是在这种情况下如何使用cl
?我使用了cygwin:gcc
,它工作得很好。有人能帮我吗?比如:在python中调用C?我说清楚了吗?提前谢谢你
好吧,现在我觉得告诉我我做了什么很重要:
我想达到的最终目标是:
我很懒,我不想用python重新编写那些c代码(在某些情况下这对我来说非常复杂),所以我只想生成dll
python可以调用的文件。我遵循Google“python调用c”给出的一个示例,在这个示例中有两个版本:linux和windows:
示例test.c
:
#include <windows.h>
BOOL APIENTRY
DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) {
return TRUE;
}
__declspec(dllexport) int
multiply(int num1, int num2) {
return num1 * num2;
}
我在我的vista系统上用cygwin做了这件事,它工作得很好;:)
2、在windows下编译:
cl -LD test.c -test.dll
我在windows命令行提示符中使用了cl,它不会工作
以下是python代码:
from ctypes import *
import os
libtest = cdll.LoadLibrary(os.getcwd() + '/test.so')
print test.multiply(2, 2)
谁能试试这个,告诉我你得到了什么?谢谢大家! > p>您将找到微软C++编译器的命令行选项。
考虑以下cl开关:
/nologo /GS /fp:precise /Zc:forScope /Gd
…并使用
/NOLOGO /OUT:"your.dll" /DLL <your lib files> /SUBSYSTEM:WINDOWS /MACHINE:X86 /DYNAMICBASE
如果使用Visual Studio工具集中的DUMPBIN工具,则可以检查DLL的导出:
dumpbin /EXPORTS foobar.dll
看到这样的事情
ordinal hint RVA name
1 0 00001010 ?multiply@@YGHHH@Z
…您可以注意到导出的名称已损坏。您通常希望导出的名称清晰,因此可以使用DEF文件指定更详细的导出,也可以使用上面的快捷方式
之后,我得到了一个DLL,可以像这样加载到Python中:
cl /nologo /GS /Zc:forScope /Gd c.cpp /link /OUT:"foobar.dll" /DL kernel32.lib /SUBSYSTEM:WINDOWS /MACHINE:X86
In [1]: import ctypes
In [2]: dll = ctypes.windll.LoadLibrary("foobar.dll")
In [3]: dll.multiply
Out[3]: <_FuncPtr object at 0x0928BEF3>
In [4]: dll.multiply(5, 5)
Out[4]: 25
[1]中的:导入ctypes
在[2]中:dll=ctypes.windl.LoadLibrary(“foobar.dll”)
在[3]中:dll.multiply
出[3]:
[4]中:dll.multiply(5,5)
Out[4]:25
请注意,我在这里使用的是ctypes.windell,这意味着stdcall。这实际上与Python无关,您只是在问如何在命令行上运行Microsoft toolchain的编译器。请考虑相应地标记你的问题。@吉姆:也许我应该添加:如何从C中生成一个DLL文件,以便Python可以调用它,就像在Windows中一样,IDE会发出恼人的噪音,这些代码与代码无关,可能是你真正的问题与你所体验到的“噪音”有关。但是您自己已经提出了一个解决方案,即从命令行编译。您可以改为询问如何配置IDE以消除噪音,或者噪音是否有任何意义。您是否可以编辑您的问题以提示当前状态或您的问题,例如,包括您迄今为止尝试了什么,收到了什么错误消息,以及您认为它无法工作的原因。当然,对不起,我出去找东西了,所以我没有看到你的帖子,我现在就发,非常感谢你
ordinal hint RVA name
1 0 00001010 ?multiply@@YGHHH@Z
In [1]: import ctypes
In [2]: dll = ctypes.windll.LoadLibrary("foobar.dll")
In [3]: dll.multiply
Out[3]: <_FuncPtr object at 0x0928BEF3>
In [4]: dll.multiply(5, 5)
Out[4]: 25