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

标签 python c dll cygwin

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

C 程序

这是我试图调用的 C 程序。只是您的标准 hello world 程序。我在 Windows 上编译这个,使用 eclipse 和 cygwin gcc 编译器生成一个 .dll 文件。

ma​​in.h

#ifndef INC_MAIN_H_
#define INC_MAIN_H_

void helloWorld();

unsigned char buf[] = "Hello World!";

#endif /* INC_MAIN_H_ */

ma​​in.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 程序调用 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/

相关文章:

c++ - 字符串[包含整数]的乘法,输出也存储在字符串中,如何?

c - 使用 Windows Api 将字符串写入映射文件

c - Dll代码到C源代码

python - 单选按钮 tkinter 传递主机值

python - 如何有效地检查 numpy 数组 a 是否包含 b

python - 如何分析sklearn中tfidf矩阵的值?

c - malloc 无法为队列中的结构创建空间

java - C++实现的JNI和DLL文件之间如何传递参数

Powershell加载dll出现错误: Add-Type : Could not load file or assembly 'WebDriver.dll' or one of its dependencies.操作不受支持

python - 基于日期时间数据在 matplotlib 中使用 axvline 添加垂直线