Python 如何使用cl命令?

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

总之,我找到了一条关于如何在python中调用c文件的信息,在这些示例中:有一个c文件,其中包括许多其他头文件,这个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