gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:16 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com