用Cygwin编译并从Python挂起调用的C程序

2024-10-03 11:19:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用ctypes从Python调用一个c程序。下面是一个最小(非)工作示例。在

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程序

然后我编写一个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输出。在


Tags: 函数import程序osmainwindowsctypeshelloworld
1条回答
网友
1楼 · 发布于 2024-10-03 11:19:04

问题是,您从一个非cygwin python调用cywgin程序,并且预期错误。在

cygwin程序与普通windows程序有不同的范例(类似Posix)。在

建议同时使用cygwin python和compiler进行测试,或同时使用windows one进行测试。在

相关问题 更多 >