我正在尝试使用 ctypes
从 Python 调用 c 程序。我在下面有一个最小(非)工作示例。
C 程序
这是我试图调用的 C 程序。只是您的标准 hello world 程序。我在 Windows 上编译这个,使用 eclipse 和 cygwin gcc 编译器生成一个 .dll
文件。
main.h
#ifndef INC_MAIN_H_
#define INC_MAIN_H_
void helloWorld();
unsigned char buf[] = "Hello World!";
#endif /* INC_MAIN_H_ */
main.c
#include <stdio.h>
#include "main.h"
void helloWorld(){
printf("\n%s\n\n", buf);
}
Python 程序
然后我编写了一个 python 脚本来加载我的 .dll
并调用 helloWorld
函数。重要的是,我确实将我创建的 .dll
和 cygwin1.dll
都拉了过来。
helloWorld.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我为 mingw 放弃了 cygwin,现在一切正常。显然 cygwin 以奇怪的方式工作。 Ahmed Masud能够找到 a useful link关于如果要将 cygwin 程序用于外部库,应该如何编译它们,但这似乎比仅使用 mingw 麻烦得多(更不用说我在尝试使用 cygwin 时遇到的其他问题)。
FWIW,这个程序也必须在命令行中运行才能看到 c 程序的输出。在python的IDLE中运行并没有捕获到c程序的printf
输出。
最佳答案
问题是您正在从 NOT cygwin python 调用 cywgin 程序并且期望错误。
cygwin 程序与普通 Windows 程序有不同的范例(类似 Posix)。
建议同时使用 cygwin python 和编译器进行测试,或者同时使用 windows 之一。
关于python - 使用 Cygwin 编译并从 Python 调用的 C 程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889558/