用ctypes向dll传入的数组,返回python后,其中的数据有时正确有时错误,怎么办?

运行环境: win10 + anaconda5.3 + jupyter

python文件

import numpy as np
import pandas as pd

mylib = ctypes.cdll.LoadLibrary('mydll.dll')
C_fun = mylib.func_name
C_fun.restypes = None
C_fun.argtypes = pass_args_Struct, c_double*10

# pass_args_Struct 是继承ctypes.Structure定义的结构体,代码略
def generate_Struct(data, 其他参数略):
    # 生成 pass_args_Struct,代码略
    # data是个DataFrame,用于接收下面myClass的data属性

class myClass():
    # myclass有个data属性,data是一个DataFrame
    # 其他代码略
    def func1(self, x):
        # 删除self.data的一列,再根据x参数重新添加这一列,代码略
        struct_x = generate_Struct(self.data, 其他参数略)
        myArr = (c_double*10)()
        C_fun(struct_x, myArr)
        npArr = np.ctypeslib.as_array(myArr,(10,))
        return pd.Series(npArr, _column_names) # _column_names 定义略

    def func2(self): 
        # 生成df,df是个只有一列值的DataFrame,代码略
        return df.apply(lamba x: self.func1(x[0]), axis=1, result_type='expand'))

    # 其他代码略

mydll.dll中的代码

#define API extern "C" __declspec(dllexport)
typedef pass_args_Struct {
    // 对应于python中pass_args_Struct,代码略
}

API void func_name(pass_args_Struct* x, double arr[]) {
    // 对arr进行一些操作,代码略
}

在jupyter中:
导入前述Python文件并生成 myObject=myClass() 之后,
执行ret1 = myObject.func1()没什么问题,
但是ret2 = myObject.func2()的结果则有时正确有时错误,错误的时候,ret2中会出现一些NaN值和错误的值。

之前把generate_Struct()定义成myclass的一个方法,连ret1也会出错;
之前的func1(self, x)中采用:

func1(self, x):
    # 其他代码略
    myArr = np.ctypeslib.as_array(myArr,(10,)) # 左边不用新名而直接用myArr
    return pd.Series(myArr, _column_names)

则ret1会频繁出错,基本上是对一次就错一次。

程序一直能运行,只是结果有时不正确。

请教各位大牛,正确的写法是什么样子的?

=====2018年11月30日更新====================================

我可能发现问题了:
Python文件TestX.py(放在PYTHONPATH下):

import numpy as np
from ctypes import Structure, c_double, c_int, POINTER

class struct_args(Structure):
    _fields_ = [('data',POINTER(c_double*2)),
                ('rows',c_int)]
class test():
    def __init__(self):
        self.data = None
    def get_args_2C(self):
        arr = np.ascontiguousarray(self.data[['foo','bar']].values, dtype=np.float)
        rows = c_int(arr.shape[0])
        return struct_args(arr.ctypes.data_as(POINTER(c_double*2)), rows)

在jupyter中:

import TestX
import pandas as pd
import numpy as np
mydata = pd.DataFrame(np.arange(1600).reshape(800,2),columns=['foo','bar']) # 行数不要太小
mytest = TestX.test()
mytest.data = mydata
args = mytest.get_args_2C()
np.ctypeslib.as_array(args.data,(800,))

输出的值经常是错误的。

=====2018年12月3日更新====================================
不知道为什么,但总算是不出错了:

python文件:

from ctypes import Structure,POINTER,c_double
def Struct_A(ctypes.Structure):
    _fields_ = [(), # 其他成员略
                ('my_arr',POINTER(c_double)] # 这个地方用c_double*10后面也会出错
class myClass():
    def makeStructA(self, 其他参数):
        arr = (c_double*10)()
        SA = Struct_A(……,arr) # 其他成员略
        return SA
    def myMethod(self, 其他参数):
        SA = self.makeStructA(其他参数)
        # myCfun是dll中的函数,功能是利用SA中数据进行一些计算,然后把结果写入SA.my_arr,具体代码略
        myCfun(SA)
        ret = pd.Series(np.ctypeslib.as_array(SA.my_arr,(10,)), _columns_name)
        ret['odd'] = 1 # 这里随便新加点什么就不会出错了
        return ret

以上代码如果没有ret['odd']=1那一行,则myObject.myMethod()返回的Series中都是错误的值(看着像是内存未初始化,比如-2.24934335e308之类),而随便给ret添加点什么内容,返回值就是正确的了。
但是在以下计算中仍然会出错,只是出错的频率变小了,而且多运行几次就会正确:

class myClass():
    # 接上文
    def myOptimize(self, arg_name, arg_range):
        ret = pd.DataFrame({arg_name:arg_range})
        _optimize = lambda arg: self.myMethod(**{arg_name:arg[arg_name]})
        return ret.join(ret.apply(_optimize, axis=1, result_type='expand'))

=====2018年12月7日更新====================================
又出错了!!!12月3日写的:

        ret['odd'] = 1 # 这里随便新加点什么就不会出错了

那个函数确实不出错了,但是别的函数用同样的写法(先生成c_double*shape再传入dll在C中写入值)得到的ret无论添加行还是添加列,多运行几次总会出错(内存被清理)。
换一种写法:

    略
    arr=np.zeros(shape)
    略
    # 然后传入arr.ctypes.data_as(POINTER(c_double*10))

目前暂时不出错了。
=====2018年12月13日更新====================================
前面的写法有问题:用函数生成结构体(比如makeStructA)再传递给dll就会出错,直接将makeStuctA的代码放到myMethod中就不会出错。
另外,传递结构体时用byref就不会出错了,在dll中用malloc给结构体的成员赋值都不会出错。

2个回答

shrek911
shrek911 你好。我看了你给的例子,传递数组部分,我写的和它一样,但是我的结果有时会出错。我的代码是放在类里面的,这个会有影响吗?
大约一年之前 回复

自己回答吧:
func1(self, x)中不直接修改self.data,传参不用结构体,循环一万次没有出错。
补充一点:
将func1改成返回一个DataFrame(而不是直接将结果写入self.data中)时,必须这样写:

    def func1(self, x):
        # ~~删除self.data的一列,再根据x参数重新添加这一列,代码略~~ 改为:
        ret = pd.DataFrame(index=self.data.index, columns=[所有的列名全部列出]) # 只有一列
        # 根据x参数和self.data对ret各列进行赋值
        r2c = ret.values.ctypes.data_as(相应的ctype)
        struct_x = generate_Struct(self.data, r2c, 其他参数略) # 结构体定义已作相应的更改,代码略
        # 后面的代码略

如果不是先将所有的列名全部列出,而是后来往ret里添加列,则无论是用self.data.计算结果.copy()还是用self.data.计算结果.values,最终的结果都会出错。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么python使用ctypes无法加载qt生成的dll?
使用ctypes可以加载windows生成的dll,但是无法加载qt生成的dll,dll使用vs depends工具 查看,确定是已经以C语言风格导出了dll,但是ctypes加载qt生成的dll报错:找不到指定的 模块,不知道为什么? 开发环境: window7 x86 python3.4 qt5.5
python3使用ctypes有些c类型没有怎么办?
被实习作业折磨到摸不着头脑 菜狗一只,平常总是靠度娘解决问题,但这次真的搜不到了(╥╯^╰╥) 实在不想用C++......而且已经丢了很久了...... 学校实习任务开发指纹仪的相关软件,调用dll函数。 问题1: dll函数:HANDLE_stdcall sensorOpen(int index) 这个类型是句柄HANDLE,其返回值需要用到,但是Python没有直接HANDLE,我用int接收暂没出现问题,怕之后会遇到先问一个。 问题2: dll函数:int_stdcall sensorCapture(HANDLE handle,unsigned char* imageBuffer, int imageBufferSize)//获取图像 handle就是上面那个,unsigned char* 文档解释是接收的图像即是输入的参数也会输出,后续指纹算法需要,ctypes也没有,怎么实现? 我目前使用imageBuffer = create_string_buffer(所需空间大小),但是没有采集到图像(我检验了该函数返回值,为0,即无图像) 我也试过了create_unicode_buffer,结果也一样。到底是使用方法问题还是其他导致我真的没采集到图像 问题3:(虽然前面的还没解决但先问下)(准确的说目前卡在这里) dll函数:HANDLE stdcall BIOKEY_INIT(int License, WORD *isize, BYTE*Params, BYTE *Buffer, intImageFlag) 问题出在isize:文档描述:[in] 传入一个无符号双字节长度为22 的数组,且 isize[0]和isize[20]为传入图像宽度,isize[1]和 isize[21]为传入图像高度 这isize怎么提前定义? 我尝试使用isize = bytearray()处理,但是毕竟是双字节,光是宽度就有300多,但byte要在0-255之间,而且还不确定都是数字(我试过定义为整型数组,报错don't konw how to convert parameter 2)。作为指纹图像,虽然有函数可以修改采集图像的大小,但是太小了的话数据的完整性和可使用性就大打折扣。所以这个双字节咋整啊 问题4: 有些函数传入参数为int*,咋整......我先去看看ctypes的文档,但是我记得上次看的时候好像没有针对这种指针的...直接使用c_char_p吗?(目前没法验证这个方法是否可行,因为前面就走不通。。。) 总之目前就这些了,实习作业周三开始检查希望会的大佬帮帮我!谢谢啦! 我先滚去看文档了。。。
Win10 64位,python3.5, 用ctypes调用DLL,读取摄像头,存为numpy数据格式.
Win10 64位,python3.5, 用ctypes调用MVCAMSDK_X64.DLL,读取mindvision的摄像头,生成jpg图像,存为numpy数据格式,求完整python代码。以下运行到Cameraplay出错,以下对应C的原形: typedef int CameraHandle; 原型: MVSDK_API CameraSdkStatus CameraSdkInit ( int iLanguageSel ); MVSDK_API CameraSdkStatus CameraInit ( tSdkCameraDevInfo* pCameraInfo, int emParamLoadMode, int emTeam, CameraHandle* pCameraHandle ); MVSDK_API CameraSdkStatus CameraPlay ( CameraHandle hCamera ); MVSDK_API CameraSdkStatus CameraEnumerateDevice ( tSdkCameraDevInfo *pDSCameraList, INT *piNums ); 以下为python 代码; from ctypes import * import numpy as np from ctypes.wintypes import * mylib=cdll.LoadLibrary('C:\Program Files (x86)\MindVision\SDK\X64\MVCAMSDK_X64.DLL') hand=HANDLE() i = c_int(1) t=c_int(-1) s=c_int(1) class tSdkCameraDevInfo(Structure): _fields_ = [('uVendorID', c_uint), ('uProductID', c_uint), ('acVendorName',c_char), ('acProductSeries',c_char), ('acProductName',c_char), ('acFriendlyName',c_char), ('acDevFileName',c_char), ('acFirmwareVersion',c_char), ('acSensorType',c_char), ('acPortType',c_char)] pi=pointer(i) ti=pointer(t) p_i=POINTER(c_int) p_p_i=p_i(i) pii=create_string_buffer(2) piii = create_unicode_buffer(2) cInfor=tSdkCameraDevInfo() l=mylib.CameraSdkInit(1) pp = create_unicode_buffer(4) j=mylib.CameraEnumerateDevice(byref(cInfor),pi) mylib.CameraInitEx.argtypes=(c_int,c_int,c_int) k = mylib.CameraInit(byref(cInfor), -1, -1, byref(hand)) g=mylib.Cameraplay(hand) ####这里出错了 print(l) print(j) print(k) print(hand)
python Ctypes 加载使用了C++amp的dll 失败
在使用python 的Ctypes调用 里面包含了C++ amp的dll的时候就会报这个错误[WinError 1114] 动态链接库(DLL)初始化例程失败。 但是如果去掉C++AMP的部分就不会报错了求解。
python ctypes 调用DLL,读取工业摄像机出错
用python ctypes 模块,调用厂家提供的c写的DLL,来读取工业摄像机,cameraInit(k = mylib.CameraInit(byref(cInfor), -1, -1, cameraHandle *p_p_i)) 成功,但 g=mylib.Cameraplay( camerahandle p_p_i) ,出错, 有谁有这方面的经验呀
python使用ctypes调用c++函数时怎样传入IPlImage型的数据?
python 代码 ``` import ctypes import numpy as np import cv2 from Face_Alignment import warp_im, coord5point, resizeimage import time from numpy.ctypeslib import ndpointer start = time.time() so = ctypes.cdll.LoadLibrary lib = so("./build/liblandmark.so") class StructPointer(ctypes.Structure): _fields_ = [("x",ctypes.c_double), ("y",ctypes.c_double)] lib.test.argtypes = [ctypes.c_int,ndpointer(ctypes.c_uint8)] path = "/Huang/images/3.jpeg" img = cv2.imread(path) imge_1 = cv2.cv.LoadImage(path, cv2.cv.CV_LOAD_IMAGE_COLOR) point = lib.landmark(1,imge_1) ``` c++代码: ``` extern "C" { seeta::StructPointer landmark(int argc, IplImage* imge) { seeta::FaceDetection detector("./build/seeta_fd_frontal_v1.0.bin"); detector.SetMinFaceSize(40); detector.SetScoreThresh(2.f); detector.SetImagePyramidScaleFactor(0.8f); detector.SetWindowStep(4, 4); seeta::FaceAlignment point_detector((MODEL_DIR + "seeta_fa_v1.1.bin").c_str()); IplImage *img_grayscale = NULL; cvCvtColor(imge, img_grayscale, CV_BGR2GRAY);//把从python中获得的iplimage参数灰度化传给img_grayscale IplImage *img_color = imge; ``` 运行结果:Traceback (most recent call last): File "test.py", line 27, in <module> point = lib.landmark(1,imge_1) ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2 这里python中的Iplimage 参数应该如何通过ctypes传入c++中。我的实际问题是怎样把在python中获得的np.array传入c++函数中并赋值给Iplimage型的参数
python 调用DLL 动态库之后 怎么释放
各位大神,请问python 利用 ctypes调用DLL之后怎么释放啊
python 调用dll如何返回多个值
import scipy.io as scio import os import ctypes import datetime import numpy as np #读取dll文件 #这里的地址目录是HessianFilter.dll所在的文件夹 start = datetime.datetime.now() cur_path = os.path.dirname(r'C:\Users\Administrator\Desktop\code_and_data\code\HessianFilter\\') dll_path = os.path.join(cur_path,'HessianFilter.dll') print dll_path dll = ctypes.windll.LoadLibrary(dll_path) #读取mat文件,Mat文件所在的文件夹中读取 matPath = r'C:\Users\Administrator\Desktop\code_and_data\data\Nodule19664.mat' imgData = scio.loadmat(matPath) #从mat文件中我们取到了整个三维数组 imgDataArray = imgData['imagetest1'] #得到数组文件的参数:宽,高,层数 widthSrc,heightSrc,sliceNumSrc = imgDataArray.shape #声明一个三维的c_float类型的数组,用于存放mat数据,并将数据转化为c_float imgDataArray_p = (((ctypes.c_float*sliceNumSrc)*heightSrc)*widthSrc)() for i in range(widthSrc): for j in range(heightSrc): for k in range(sliceNumSrc): imgDataArray_p[i][j][k] = ctypes.c_float(imgDataArray[i][j][k]) imgDataP = ctypes.POINTER(ctypes.c_float)(imgDataArray_p) print '---------->' #需要再声明两个返回值 HessianDot = (ctypes.c_float*(widthSrc*heightSrc*sliceNumSrc))() HessianLine = (ctypes.c_float*(widthSrc*heightSrc*sliceNumSrc))() HessianDot_p = ctypes.POINTER(ctypes.c_float)(HessianDot) HessianLine_p = ctypes.POINTER(ctypes.c_float)(HessianLine) #定义一个常数 sigma = ctypes.c_float(8) #定义一个三维数组 imgSize = [widthSrc,heightSrc,sliceNumSrc] imageSize = (ctypes.c_float*len(imgSize))(*imgSize) #定义一个指向三维数组的指针 imageSizeP = ctypes.POINTER(ctypes.c_float)(imageSize) #这个就是调用dll中的函数了 dll.RunHessianMultiThread(ctypes.byref(imgDataArray_p),sigma,ctypes.byref(imageSizeP),ctypes.byref(HessianDot_p),ctypes.byref(HessianLine_p),4) print '--调用后-点数据--' print HessianDot_p print HessianDot_p[0:24] #print HessianDot_p.contents print '--调用后-线数据--' print HessianLine_p print HessianLine_p[0:24] #print HessianLine_p.contents print '<---------Over------------->\n\n' print datetime.datetime.now()-start
python调用dll的释放问题
小弟用python 写了个调用SiInterface.dll的adaptor.exe 这里有调用win32api.FreeLibrary()释放dll了, 运行该adaptor.exe后,做完一个交易后,其他程序调用这个dll做交易就会加载不到这个dll,请问是我没释放成功SiIterface.dll 还是adaptor.exe打开运行后,他就一直占用着SiInterface.dll 因为在使用adaptor.exe做完一个交易后关闭该exe,再使用别的程序调用SiInterface.dll就是ok的,请教各位大神如何在不关闭adaptor.exe情况下 还能是别的程序能够访问该SiInterface.dll def call_mi_dll(sIn): dll = ctypes.WinDLL('SiInterface.dll') sIn += ' '*(512-len(sIn)) sOut = ' '*512 i=' '*1024 i=ctypes.c_char_p(i) sIn = ctypes.c_char_p(sIn) sOut = ctypes.c_char_p(sOut) print "calling: SiInterface.dll -> INIT" ret=dll.INIT(i) print "Init :"+str(ret) print "calling: SiInterface.dll -> BUSINESS_HANDLE" dll.BUSINESS_HANDLE(sIn, sOut) win32api.FreeLibrary(dll._handle) return sOut.value
Python ctypes 中回调函数设置
我在python中想调用dll库的函数,但是这个dll库的函数参数需要设置一个回调函数指针,如下 void setCallBack(void(*)(Data &a)) Data is C struct, declare as below typedef struct { int index, .... }Data 我在python中调用代码如下: mydll = cdll.LoadLibrary("XXX.dll") callback_type = CFUNCTYPE(None, POINTER(Data)) callback = callback_type(Data) mydll.setCallBack(callback) def dataResponse(data): print data.index class Data(ctypes.Structure): _fields_ = [("index", c_int)] 调用时发生"WindowsError: [Error -1073741795] Windows Error 0xC000001D"错误, 请大家帮忙看一下如何设置回调函数,感觉如何参数类型是C++引用的话,POINTER好像是不对的。
python的ctypes加载遇到相互依赖的库如何处理?
现在又两个库函数a.so和b.so,现在想加载a库实现a库里的ar方法,加载a库的时候报错提示OSError: /usr/lib/a.so: undefined symbol:bf,经过核实bf在b库里于是加载b库,发现b库也报错OSError: /usr/lib/b.so: undefined symbol:af,进经过了解两个库相互依赖,导致ctyps两个库都无法加载,从而不能实现a库方法的调用。想问下大家: 1.这类问题如何处理? 2.有没有指定加载库里的函数的方法
在python中用ctypes模块调用Windows API的问题
用python做一个windows平台的工具,纯python缺乏接口,因此想用ctypes模块调用Windows API来实现,碰到了下列问题: 用python封装Windows 中的SystemTimeToFileTime,调用过程中提示参数不对。 Windows API 原型 BOOL WINAPI SystemTimeToFileTime( __in const SYSTEMTIME* lpSystemTime, __out LPFILETIME lpFileTime ); python 封装代码: from ctypes import * from ctypes.wintyps import * #封装 SYSTEMTIME 类型 class SYSTEMTIME(Structure): __fields__ = [("Year", WORD), ("Month", WORD), ("DayOfWeek", WORD), ("Day", WORD), ("Hour", WORD), ("Min", WORD), ("Sec", WORD), ("MillSec", WORD)] # FILETIME class FILETIME(Structure): __fields__ = [("dwLowDateTime", DWORD), ("dwHighDateTime", DWORD)] # 封装SystemTimeToFileTime proto_systm2filetm = WINFUNCTYPE(BOOL, POINTER(SYSTEMTIME), POINTER(FILETIME)) paramflags = (1, "systime", None), (2, "filetime", None) SystemTimeToFileTime = proto_systm2filetm(("SystemTimeToFileTime", windll.kernel32), paramflags) #测试 atime = FILETIME() atime.dwLowDateTime = 0 atime.dwHighDateTime = 100 systm = SYSTEMTIME() systm.Year = 2015 systm.Month = 1 systm.Day = 5 systm.DayOfWeek = 1 systm.Hour = 1 systm.Min = 17 systm.Sec = 0 print SystemTimeToFileTime(systime = pointer(systm), filetime=pointer(atime)) print "error:%d" % GetLastError() #结果: 提示 print SystemTimeToFileTime(systime = pointer(systm), filetime=pointer(atime)) TypeError: call takes exactly 1 arguments (2 given) 疑问:SystemTimeToFileTime明明声明了2个参数,为啥提示只接受一个参数? 尝试修改,将paramflags该成: paramflags = (1, "systime", None), (1, "filetime", None) 这下没有提示参数个数不对了,但是函数执行返回FALSE, GetLastError == 87(参数不正确)。 请各位帮忙把把脉,API中的 IN, OUT参数,用ctypes应该如何包装? 使用时如何传实参? 万分感谢!
Python 使用ctypes的shell32 获取文件详细属性
import ctypes shell32 = ctypes.windll.LoadLibrary('shell32.dll') folderitems= 应该如何将文件路径转化为对象?'F:\\1.pptx' a = folderitems.ExtendedProperty("Title") print a
AIX系统Python缺少_ctypes模块
AIX6.1,自带的Python2.7.5,试图在上面安装setuptools插件,报缺少_ctypes模块, ![图片说明](https://img-ask.csdn.net/upload/201708/03/1501740395_976629.png) 检查了Linux系统和Windows,在Python的lib库里面有_ctypes.so和_ctypes_test.so两个库,但AIX下只有test一个。 ![AIX](https://img-ask.csdn.net/upload/201708/03/1501740669_470043.png)AIX系统 ; ![Ubuntu](https://img-ask.csdn.net/upload/201708/03/1501740697_443887.png)Ubuntu系统 试过重装Python-libs这个RPM包,但报包冲突。升级Python也是诸多系统库缺少或者安装冲突。 求助各位大神,该如何破,缺少_ctypes模块,不仅setuptools,还有pip等组件都装不了。
python3 ctypes 的 结构体定义中,怎么引用自身?
我这么使用时提示说“找不到Sentence_link” ``` class Sentence_link(ctypes.Structure): _fields_= [("para_idx", ctypes.c_ulong), ("sent_idx", ctypes.c_ulong),("sent_init",ctypes.c_int),("msg_buff",ctypes.c_char_p), ("next",ctypes.POINTER(Sentence_link))] ``` ``` _fields_= [("para_idx", ctypes.c_ulong), ("sent_idx", ctypes.c_ulong),("sent_init",ctypes.c_int),("msg_buff",ctypes.c_char_p), ("next",ctypes.POINTER(Sentence_link))] NameError: name 'Sentence_link' is not defined ``` 请问该如何引用自身?
Python调用c++写的dll,出现function "add"not found错误
该dll在c++里面可以成功调用。 dll的.h: #pragma once #ifdef FILE_RW_DLL_EXPORTS #define FILE_RW_DLL_API extern "C"__declspec(dllexport) #else #define FILE_RW_DLL_API extern "C"__declspec(dllimport) #endif #include "stdafx.h" double __stdcall add(double a, double b); dll的.cpp: #include "stdafx.h" #include "file_rw_dll.h" double __stdcall add(double a, double b) { return (a+b); } python调用程序: import ctypes filedll=ctypes.WinDLL("file_rw_dll.dll") print(filedll.add(1,2)) 在c++中调用该生成的dll没有问题,python中调用出现“AttributeError: function 'add' not found” 求教!
python 调用C++ dll (该dll 依赖其他dll)
问题描述: C++中有两个类 bclass 和 nclass,其中nclass 里面的一个private变量就是bclass。 这两个类目前都被写成了动态库 libbclass.so 和 libnclass.so。 当我在Python中利用ctypes模块希望调用libnclass.so的时候,程序报错 OSError: libbclass.so: cannot open shared object file: No such file or directory 我的问题: 1、如何调用libnclass.so 2、如何在python中创建一个nclass类的实例,并调用该实例的方法add
问题: python如何调用Qt带有GUI模块的DLL?
<br/> **环境配置:**<br/> Win10 X64<br/> Python 3.5.2 32 bit <br/> Qt 5.5.1 MinGW 4.9.2 32.bit<br/> <br/><br/> **Qt DLL代码实现:** ```Qt extern "C" __declspec(dllexport) void showMessageWindow(char *msg) { QMessageBox::information(nullptr, "Title", msg); } extern "C" __declspec(dllexport) int add(int num1, int num2) { return num1 + num2; } ``` **python调用代码:** ```python from ctypes import * dll = cdll.LoadLibrary("QtDllTest.dll") print("add result=", dll.add(1, 2)) dll.showMessageWindow(b"Hello, Python Call C++!"); ``` **python执行结果:** ![图片说明](https://img-ask.csdn.net/upload/201612/12/1481523758_959360.png) **代码说明:** 1. python正常调用add函数。执行结果打印出了"add result= 3"; 2. python调用showMessageWindow失败。showMessageWindow设计GUI模块。 <br/><br/> > **问题: python如何调用Qt带有GUI模块的DLL?** <br/><br/> **本人的探索:** * python可以正常调用VC带UI的DLL. * 网上资料建议在可执行程序下,加入Qt5.5.1/5.5/mingw492_32的platforms和plugins目录下所有内容.结果仍然出现上面的错误.
自己网上下载的python库,如何使用pycharm进行安装使用呢?
在pycharm中setting里头添加ctypes,但是没有用,所以自己在网上下载。 下载的ctypes-1.0.2.win32-py2.5-AMD64.msi文件应该如何安装? 望哪位大神指导一下啊,谢谢。
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
这30个CSS选择器,你必须熟记(上)
关注前端达人,与你共同进步CSS的魅力就是让我们前端工程师像设计师一样进行网页的设计,我们能轻而易举的改变颜色、布局、制作出漂亮的影音效果等等,我们只需要改几行代码,不需...
国产开源API网关项目进入Apache孵化器:APISIX
点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!近日,又有一个开源项目加入了这个Java开源界大名鼎鼎的Apache基金会,开始进行孵化器。项目名称:AP...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
编写Spring MVC控制器的14个技巧
本期目录 1.使用@Controller构造型 2.实现控制器接口 3.扩展AbstractController类 4.为处理程序方法指定URL映射 5.为处理程序方法指定HTTP请求方法 6.将请求参数映射到处理程序方法 7.返回模型和视图 8.将对象放入模型 9.处理程序方法中的重定向 10.处理表格提交和表格验证 11.处理文件上传 12.在控制器中自动装配业务类 ...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
求小姐姐抠图竟遭白眼?痛定思痛,我决定用 Python 自力更生!
点击蓝色“Python空间”关注我丫加个“星标”,每天一起快乐的学习大家好,我是 Rocky0429,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻...一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片:是谁!是谁把我女朋友的照片放出来的!awsl!太好看了叭...等等,那个背景上的一堆鬼画符是什么鬼?!真是看不下去!叔叔婶婶能忍,隔壁老王的三姨妈的四表...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
相关热词 c# 图片上传 c# gdi 占用内存 c#中遍历字典 c#控制台模拟dos c# 斜率 最小二乘法 c#进程延迟 c# mysql完整项目 c# grid 总行数 c# web浏览器插件 c# xml 生成xsd
立即提问