我想在我的python程序的关键部分实现C#代码,以使其更快。它说(在Python文档和此站点上),您可以按以下方式加载动态链接库(也就是PyDocs):
cdll.LoadLibrary("your-dll-goes-here.dll")
这是我的代码中负责此功能的部分:
from ctypes import *
z = [0.0,0.0]
c = [LEFT+x*(RIGHT-LEFT)/self.size, UP+y*(DOWN-UP)/self.size]
M = 2.0
iterator = cdll.LoadLibrary("RECERCATOOLS.dll")
array_result = iterator.Program.ITERATE(z[0],z[1],c[0],c[1],self.iterations,M)
z = complex(array_result[0],array_result[1])
c = complex(array_result[2],array_result[3])
last_iteration = int(round(array_result[4]))
我使用的RECERCATOOLS.dll是这样的(C#代码,而不是C或C ++):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KarlsTools;
public class Program
{
public static Array ITERATE(double z_r,double z_i,double c_r,
double c_i, int iterations,
double limit)
{
Complex z = new Complex(z_r, z_i);
Complex c = new Complex(c_r, c_i);
for (double i = 1; Math.Round(i) <= iterations; i++)
{
z = Complex.Pow(z, 2) + c;
if (Complex.Abs(z) < limit)
{
double[] numbers = new double[] { Complex.Real(z),
Complex.Imag(z),
Complex.Real(c),
Complex.Imag(c),
i};
return numbers;
}
}
double iter = iterations;
double[] result = new double[] { Complex.Real(z),
Complex.Imag(z),
Complex.Real(c),
Complex.Imag(c),
iter};
return result;
}
}
要构建此DLL,我在Visual Studio 2010项目上使用“构建”命令,该项目仅包含此文件和对“
Karlstools”的引用,该模块允许我使用复数。
我不知道为什么,但是当我尝试运行我的Python代码时,它只会引发异常:
[...]
array_result = iterator.Program.ITERATE(z[0],z[1],c[0],c[1],self.iterations,M)
File "C:\Python32\lib\ctypes\__init__.py", line 353, in __getattr__
func = self.__getitem__(name)
File "C:\Python32\lib\ctypes\__init__.py", line 358, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Program' not found
我需要这方面的帮助,因为即使将所有内容都设置为,public
并且将函数设置为static
,或者即使我尝试不指定“
Program”类直接访问该函数,它也会不断抛出异常…我不知道该在哪里问题可能是。
您会发现有关使用ctypes从Python调用DLL的技巧大部分时间依赖于用C或C
++而不是C#编写的DLL。使用C#,您需要拉入CLR的整个机制,并且符号很可能被弄乱了,而不是ctypes所期望的那样,并且您将在输出数组的垃圾回收中遇到各种麻烦。
当使用python的点网(http://pythonnet.sf.net)连接python和C#代码时,我取得了很好的成功,您可能想尝试一下。
另一方面,如果您追求纯粹的性能,请考虑使用Python / C
API(http://docs.python.org/c-api/)将代码重写为Python的本机C扩展。
问题内容: 我有一个带有一个单一函数的DLL,它具有五个双精度和一个整数: 它重新调整了由三重数组组成的自定义结构计算的res: 要返回值,我这样做: 我已经用MinGW对其进行了编译,并且试图在python中使用它来执行以下操作: 但是,每当我尝试使用这些值调用函数时,都会将其抛出: 我也不知道如何捕获我声明的自定义结构并将其每个元素转换为Python浮点数。我研究了这个PyDocs链接,但无济
本文向大家介绍Python使用ctypes调用C/C++的方法,包括了Python使用ctypes调用C/C++的方法的使用技巧和注意事项,需要的朋友参考一下 python使用ctypes调用C/C++ 1. ctpes介绍 ctypes is a foreign function library for Python. It provides C compatible data types, a
问题内容: 我正在使用ctypes在Python中加载DLL。这很好。 现在,我们希望能够在运行时重新加载该DLL。 直接的方法似乎是:1.卸载DLL 2.加载DLL 不幸的是,我不确定卸载DLL的正确方法是什么。 _ctypes.FreeLibrary可用,但私有。 还有其他卸载DLL的方法吗? 问题答案: 您应该能够通过放置对象来做到这一点 编辑: 霍普的评论是正确的,这取消了名称的绑定,但是
问题 你有一些C函数已经被编译到共享库或DLL中。你希望可以使用纯Python代码调用这些函数, 而不用编写额外的C代码或使用第三方扩展工具。 解决方案 对于需要调用C代码的一些小的问题,通常使用Python标准库中的 ctypes 模块就足够了。 要使用 ctypes ,你首先要确保你要访问的C代码已经被编译到和Python解释器兼容 (同样的架构、字大小、编译器等)的某个共享库中了。 为了进行
问题内容: 我想从Python应用程序调用C库。我不想包装整个API,只包装与我的情况相关的函数和数据类型。如我所见,我有三个选择: 在C中创建一个实际的扩展模块。可能有点过头了,我还想避免学习扩展编写的开销。 使用Cython将C库的相关部分公开给Python。 使用Python与外部库进行通信,从而完成整个工作。 我不确定2)还是3)是更好的选择。3)的优点是它是标准库的一部分,并且生成的代码
问题内容: 我正在尝试使用Python ctypes访问DLL文件中的函数。提供的功能说明如下。 该函数引用DLL中定义的一些变量类型。接下来介绍这些变量 请注意,在提供的头文件之一中定义了“ pichar”,如下所示: 这似乎很简单,但是出于某种原因对我来说却无法解决。 我的理解如下:我向函数传递了三个变量: 1)一个,实际上是一个。有人告诉我python ctypes本质上不支持枚举,因此我将
本文向大家介绍ActiveMQ:使用Python访问ActiveMQ的方法,包括了ActiveMQ:使用Python访问ActiveMQ的方法的使用技巧和注意事项,需要的朋友参考一下 Windows 10家庭中文版,Python 3.6.4,stomp.py 4.1.21 ActiveMQ支持Python访问,提供了基于STOMP协议(端口为61613)的库。 ActiveMQ的官文Cross L
本文向大家介绍C++调用C#的DLL实现方法,包括了C++调用C#的DLL实现方法的使用技巧和注意事项,需要的朋友参考一下 SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库。本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件。 具体的实现步骤如下: 一、创建C# DLL,需要指定应用类型为“类库”,代码: 二、C++客户程序,是个控制台应用,代码: 三、这里有几点