wordpress设置菜单,宁波网站优化公司推荐,网站建设原则应考虑哪些内容,廊坊网站优化python导入C#动态库问题
背景介绍
我使用的python是3.7#xff0c;需要调用之前已经用于其他项目的C#编写的动态库(xx.dll).由于调用方法很简单#xff0c;可以参考下这个调用动态库,这里主要说一下我遇到的问题。
试图加载格式不正确的程序
这个问题实际是由于目标程序和…python导入C#动态库问题
背景介绍
我使用的python是3.7需要调用之前已经用于其他项目的C#编写的动态库(xx.dll).由于调用方法很简单可以参考下这个调用动态库,这里主要说一下我遇到的问题。
试图加载格式不正确的程序
这个问题实际是由于目标程序和调用的dll不处于相同的编码上我的目标python使用的是64位编译而调用的程序采用的是32位编译这就导致调用出错。可以参考这个详解Python 调用C# dll库最简方法中的2来改变动态库的编码。
引入clr却无法使用FindAssembly等函数
有一个clr包但是python调用clr包却是从pythonnet里面的模块所以下载时候一定要下载对了。但是我自动安装的时候发现clr成功import了但是里面不包含常用的findAssembly等函数。之后发现大多的说明的是2.5左右的版本而我的安装包是3.1的于是没办法只能退回去按装了指定的版本2.5.1的了。问题给解决了。
动态加载dll库
我的项目要求尽可能兼容其他不同语言编写的dll所以我这里就使用了反射来加载C#动态库。首先python程序指定位置我用的是xml文件配置上需要加载的dll路径然后python程序启动的时候就根据配置文件指定的路径一个个加载dll。这就导致python在import的时候不知道import哪个模块(只知道模块的名字)于是我就各种找如何动态引入。最后发现使用exec执行命令的方式完美解决。具体方式如下 sys.path.append(os.getcwd() \\static\\dll)if .dll in dllPath:backRec dllPath.index(.dll)tempModuleName dllPath[0:backRec]clr.FindAssembly(static/dll/ tempModuleName)else:clr.FindAssembly(static/dll/ dllPath)clr.AddReference(tempModuleName)execcmd from %s import %s,%s % (nameSpace, classname, InitClassName)exec(execcmd)反射模块(inspect)使用问题
导入模块之后需要根据配置文件中具体的方法名称类名称来获取对应的方法和类。所以使用inspect这个模块inspect可以通过getmembers来获取具体的属性。然后根据名字找到对应的方法和类。具体代码可以参考如下 for key, obj in inspect.getmembers(sys.modules[nameSpace]):if key classname:curParseClass objbreakcurParseClass就是名字位classname的类然后就可以用其进行初始化对象并调用类成员函数或者直接调用静态函数或者对象。但是这里我碰到一个问题就是inspect.getmembers获取对象属性时有时会失败失败的原因是调用的C#动态库定义的类中有个属性由枚举转化得到的字符串即私有属性_deviceType为string公有属性DeviceType为枚举对象get返回时使用名称获取对应的枚举返回。但是_deviceType的默认值为空而其枚举里并没有这个属性就会导致inspect.getmembers将DeviceType转化为string时出现了无法转化的情况。