问题描述
我想在python程序的关键部分实现C#代码,以使其更快.它说(在Python文档和此站点),您可以按以下方式加载动态链接库(也就是PyDocs):
I would like to implement C# code in a critical part of my python program to make it faster. It says (on Python documentation and this site) that you can load a Dynamic Link Library (and so say the PyDocs) as follows:
cdll.LoadLibrary("your-dll-goes-here.dll")
这是我的代码中负责此功能的部分:
This is the part of my code that takes care of this feature:
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 ++):
And the RECERCATOOLS.dll that I use is this (C# code, not C or 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"的引用,该模块允许我使用复数.
To build this DLL I use "Build" command over the Visual Studio 2010 project, which only contains this file and a reference to "Karlstools", a module that allows me to use complex numbers.
我不知道为什么,但是当我尝试运行我的Python代码时,它只会引发异常:
I don't know why but when I try to run my Python code, it just throws an exception:
[...]
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"类,它也会不断抛出异常...我不知道问题出在哪里.
I need help with this, since it keeps throwing me exceptions even with everything is set to public
and the function as static
, or even when if I try to access the function directly without specifying the "Program" class... I have no clue where the problem could be.
推荐答案
您会发现有关使用ctypes从Python调用DLL的技巧大部分时间依赖于用C或C ++而不是C#编写的DLL.使用C#,您需要拉入CLR的整个机制,并且符号很可能被弄乱了,而不是ctypes所期望的那样,并且您将在输出数组的垃圾回收中遇到各种麻烦.
The tips you'll find regarding calling DLL from Python using ctypes rely most of the time to the DLL being written in C or C++, not C#. With C# you pull in the whole machinery of the CLR, and the symbols are most likely mangled and not what ctypes expect, and you'll get all sorts of troubles from the garbage collection of your output array.
通过使用python进行点网连接python和C#代码时,我取得了很大的成功( http://pythonnet. sf.net ),您可能需要尝试一下.
I've had very good success when interfacing python and C# code by using python for dot net (http://pythonnet.sf.net), you may want to try this.
另一方面,如果您出于纯粹的性能考虑,请考虑使用Python/C API将代码重写为Python的本机C扩展( http://docs.python.org/c-api/).
On the other hand if you are in for pure performance, consider rewriting your code as a native C extension for Python using the Python/C API (http://docs.python.org/c-api/).
这篇关于在python中使用ctypes访问C#dll的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!