我试图用ctypes
从Python调用一个c程序。下面是一个最小(非)工作示例。在
这是我要调用的C程序。只是你标准的hello world程序。我在windows上编译这个,使用eclipse和cygwingcc编译器生成一个.dll
文件。在
main.h
#ifndef INC_MAIN_H_
#define INC_MAIN_H_
void helloWorld();
unsigned char buf[] = "Hello World!";
#endif /* INC_MAIN_H_ */
main.c
^{pr2}$然后我编写一个python脚本来加载我的.dll
并调用helloWorld
函数。重要的是,我确实把我创建的.dll
和{
地狱世界.py
from ctypes import CDLL
import os
def loadDLL(file):
file = file.replace('\\','/')
if not os.path.exists(file):
raise FileNotFoundError(file)
print('Opening DLL File:', file)
dll = CDLL(file)
return dll
if __name__ == '__main__':
dll = loadDLL(FILE_TO_LOAD)
dll.helloWorld()
当我运行这个程序时,loadDLL
工作正常并加载DLL。但是,从c程序调用helloWorld
函数会导致它挂起。在
奇怪的是,如果我将printf
行替换为一些无害的东西(例如,int x = 0
),它执行良好,但打印出一个看似随机的数字。在
谁能告诉我我做错了什么吗?或者是找出问题的方法?在
顺便说一句,我能够得到一个几乎完全相同的设置,在linux系统上运行得很好,所以我猜这是由于我设置的windows环境,但我无法开始猜测它到底是什么。在
更新
我写这篇文章并不是为了回答问题,因为它解决不了问题的字面意思,而只是精神上的问题。在
在Jean-Francois Fabre's suggestion我把cygwin交给了mingw,现在一切如期进行。显然,小天鹅的工作方式很奇怪。Ahmed Masud能够找到a useful link关于cygwin程序如果要用于外部库的话应该如何编译,但是这似乎比使用mingw要麻烦得多(更不用说我在尝试使用cygwin时遇到的其他问题)。在
FWIW,这个程序也必须在命令行上运行,才能看到c程序的输出。在python的IDLE中运行没有捕获c程序的printf
输出。在
问题是,您从一个非cygwin python调用cywgin程序,并且预期错误。在
cygwin程序与普通windows程序有不同的范例(类似Posix)。在
建议同时使用cygwin python和compiler进行测试,或同时使用windows one进行测试。在
相关问题 更多 >
编程相关推荐