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

时间:2017-09-20 16:54:54

标签: python c dll cygwin

我试图使用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函数。重要的是,我确实将我创建的.dllcygwin1.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程序调用{​​{1}}函数会导致它挂起。

奇怪的是,如果我用无关紧要的东西(例如helloWorld)替换printf行,它会执行正常但打印出一个看似随机的数字。

有人能指出我做错了什么吗?甚至可以找出出错的方法?

是的,我能够得到一个几乎相同的设置才能在Linux系统上正常工作,所以我猜测它是由于我设置的Windows环境,但是我无法开始猜测它究竟是什么。

更新

我不是写这个作为答案,因为它没有解决问题的信,而只是解决问题。

Jean-Francois Fabre's suggestion我放弃了cygwin用于mingw,现在事情按预期工作了。显然cygwin以奇怪的方式工作。 Ahmed Masud能够找到关于如何编译cygwin程序的a useful link,如果它们被用于外部库,但是使用mingw似乎更麻烦(更不用说我尝试使用cygwin时遇到的其他问题。)

FWIW,此程序还必须在命令行上运行才能查看c程序的输出。在python的IDLE中运行没有捕获c程序的int x = 0输出。

1 个答案:

答案 0 :(得分:3)

问题是你是从一个非cygwin python调用一个cywgin程序并且有错误的期望。

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

建议使用cygwin python和编译器,或两个窗口都进行测试。