我正在尝试使用从Python调用ac程序ctypes
。我在下面有一个最低限度的(非工作)示例。
这是我要调用的C程序。只是您的标准hello world程序。我在Windows上使用eclipse和cygwin
gcc编译器对此进行编译以生成.dll
文件。
主文件
#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脚本来加载我的脚本.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。但是,helloWorld
从c程序调用该函数会导致其挂起。
奇怪的是,如果我用printf
无害的东西(例如int x = 0
)替换了该行,它执行得很好,但会打印出一个看似随机的数字。
谁能指出我做错了什么?甚至是找出问题所在的方法?
顺便说一句,我能够获得几乎相同的设置,以便在Linux系统上正常工作,因此,我猜测这是由于设置了Windows环境造成的,但我无法开始猜测它的真正含义。
更新
我之所以不将其写为答案,因为它不能解决问题的实质,而只能解决精神问题。
在让-弗朗索瓦·法布尔(Jean-Francois
Fabre)的建议下,
我放弃了cygwin来使用mingw,现在一切正常。显然,cygwin的工作方式很奇怪。Ahmed
Masud能够找到有关将cygwin程序用于外部库时应如何编译的有用链接,但这似乎比仅使用mingw麻烦得多(更不用说我已经遇到的其他问题了)尝试为此使用cygwin)。
FWIW,此程序也必须在命令行上运行才能查看c程序的输出。在python的IDLE中运行无法捕获printf
c程序的输出。
问题是您正在从NOT cygwin python调用cywgin程序,并且期望值错误。
cygwin程序具有与普通Windows程序不同的范式(类似于Posix)。
建议同时使用cygwin python和编译器,或者同时使用Windows一台进行测试。
问题内容: 安装新的Windows系统后,我已经在默认位置(和 )安装了CygWin和64位Python(2.7.3),并将CygWin bin和Python目录都添加到了我的路径中(在用户变量PATH中)。在正常的命令窗口中,Python可以完美启动,但是当我在CygWin环境中调用它时,它挂起了,从不提示输入提示。 以前,我已经在其他计算机上做到了这一点,但始终使用旧版本的Python(32位
在安装一个新的Windows系统时,我已经在其默认位置(和)安装了CygWin和64位Python(2.7.3),并将CygWin bin和Python目录都添加到了我的路径中(在用户变量path中)。在正常的命令窗口中,Python可以完美地启动,但是当我在CygWin环境中从调用它时,它会挂起,从不给我输入提示。 我以前在其他机器上也这样做过,但总是使用旧版本的Python(32位)和CygW
问题内容: 我最近一直在Windows上使用Cygwin。我想使用Windows安装的Python,因此在测试期间,我使用而不是。 除打印外,这几乎可以完美地工作。当我从Cygwin运行Windows Python时,直到执行完成才输出输出。它可以通过explorer.exe或cmd.exe在Windows Python中正常运行,并且可以使用Cygwin安装的Python()在Cygwin中运行
问题内容: 我想从我的C ++程序中调用python脚本文件。 我不确定要分发给的人是否会安装python。 基本上,我正在寻找一个可以使用的具有Apache类似发行许可证的.lib文件。 问题答案: Boost有一个python接口库可以为您提供帮助。 Boost.Python
问题内容: 我目前正在努力从python脚本调用非python程序。 我有一个〜1000个文件,当通过此C ++程序传递时,将生成〜1000个输出。每个输出文件必须具有唯一的名称。 我希望运行的命令具有以下形式: 到目前为止,我已经尝试过: 因此,我有一个必要文件的数组。我的问题-如何遍历数组并为每个条目将其作为参数传递给上述命令(program_name),并为每个文件指定唯一的输出ID? 问题
问题内容: 构建与C或C ++库的Python绑定的最快方法是什么? (如果这很重要,我正在使用Windows。) 问题答案: Boost Python库是用于连接Python和C 的框架。它使您可以快速而无缝地将C 类的函数和对象暴露给Python,反之亦然,而无需使用特殊工具-仅使用C 编译器即可。它被设计为以非介入方式包装C 接口,因此您不必为了包装而完全更改C ++代码,从而使Boost.