Tag: python

嵌入式Python 2.7.2从用户定义的目录导入模块

我将Python嵌入到将具有已定义API的C / C ++应用程序中。 应用程序需要实例化脚本中定义的类,其结构大致如下: class userscript1: def __init__(self): ##do something here… def method1(self): ## method that can be called by the C/C++ app…etc 我过去曾经管理过(为了概念validation)使用以下类型的代码完成这项工作: PyObject* pName = PyString_FromString(“userscript.py”); PyObject* pModule = PyImport_Import(pName); PyObject* pDict = PyModule_GetDict(pModule); PyObject* pClass = PyDict_GetItemString(pDict, “userscript”); PyObject* scriptHandle = PyObject_CallObject(pClass, NULL); 现在我处于更多的生产环境中,这在PyImport_Import行失败了 – 我想这可能是因为我正在尝试将目录添加到脚本名称,例如 PyObject* pName = PyString_FromString(“E:\\scriptlocation\\userscript.py”); 现在,为了让您了解我尝试过的内容,我尝试在所有这些调用之前修改系统路径以使其搜索此模块。 […]

c malloc数组指针在cython中返回

如何有效地将cython中的malloc数组指针(或numpy数组指针)返回到python3。 只要我不返回数组指针,cython代码就可以正常工作 我想要: def double complex* randn_zig(int n): … r = malloc(n*n*sizeof(double complex)) … return r c11(gcc 11)等价物是: double complex* randn_zig(int n){ r = malloc(n*n*sizeof(double complex)) return r } 我试过 randn_zig(int n): 和randn_zig( r, int n): 到目前为止,其他排列没有成功。 c和cython代码版本的速度是Numby / pylab randn版本的5倍,如果我能找到一种方法来返回指向大型10 ^ 6到10 ^ 10双复数组的指针。

为什么SCons VariantDir()没有将输出放在给定目录中?

我正在考虑将SCons用于新项目。 它看起来非常好,虽然我发现VariantDir非常混乱。 我有一个简单的项目,在一个目录中有一些C源文件,我想在“正常”和“配置文件”模式下构建 – 与gcc有两组不同的选项。 我希望输出分别进入普通的/和profile /目录。 为了测试,我已经减少了一个源文件tc,其中有一个main() 。 我的SConstruct文件位于同一目录中,如下所示: normal = DefaultEnvironment(tools=[‘mingw’], CCFLAGS = ‘-O2’) normal.VariantDir(‘release’, ‘.’, duplicate=0) normal.Program(‘t’, [‘t.c’]) #profile = normal.Clone(CCFLAGS=’-O2 -pg’, LINKFLAGS = ‘-pg’) #profile.VariantDir(‘profile’, ‘.’, duplicate=0) #profile.Program(‘t’, [‘t.c’]) 当我运行scons时,我希望它能将t.exe放入release /,但它会将它们放在当前目录中。 并且我无法运行它,并且3个配置文件行未注释 – 如果我这样做,我会收到此错误: scons:***为同一目标指定了两个具有不同操作的环境:to 基本上,我不确定为什么我的VariantDir()调用没有告诉scons将输出放在指定的输出目录中, release 。 (我在文档和新闻组中读了很多,但没有回答这个问题。我最接近的是这个页面 ,它描述了一个类似的东西,但它涉及一个单独的src /目录和两个独立的scons文件,以及在它们之间导入/导出变量。这看起来不太愉快。)

独立于操作系统的Python和C之间的程序间通信

我几乎不知道我在这里做了什么,我之前从未做过这样的事情,但我和朋友正在编写竞争的国际象棋程序,他们需要能够相互沟通。 他将主要用C语言编写,我的大部分内容将使用Python,我可以看到一些选项: 或者写入临时文件或连续的临时文件。 由于通信不会以任何方式笨重,这可能会起作用,但对我来说似乎是一个丑陋的工作,程序将不得不继续检查更改/新文件,它只是看起来很难看。 找到一些操纵管道的方法,即mine.py | ./his。 这似乎有点死路一条。 使用套接字。 但是我不知道我会做什么,所以有人可以给我一些阅读材料的指针吗? 我不确定是否存在独立于操作系统,与语言无关的方法。 是否必须有某种管理服务器程序来管理? 使用某种HTML协议,这似乎有点矫枉过正。 我不介意程序必须在同一台机器上运行。 人们推荐什么,我在哪里可以开始阅读?

包装C库

我有一个private.h , public.h和file.c ,我需要将它包装到Cython中 。 如何包装函数Person_ptr Person_create(const char* name); ? private.h: #ifndef __PERSON_PRIVATE_H__ #define __PERSON_PRIVATE_H__ #include “Person.h” typedef struct Person_TAG { char* name; int age; } Person; void person_init(Person_ptr self, const char* name); # endif /* __PERSON_PRIVATE_H__ */ public.h #ifndef __PERSON_H__ #define __PERSON_H__ #include typedef struct Person_TAG* Person_ptr; #define PERSON(x) \ ((Person_ptr) (x)) #define PERSON_CHECK_INSTANCE(x) […]

Python和/或C / C ++中的高精度算术?

摘要:哪种Python包或C-Library是高精度算术运算的最佳选择? 我有一些函数可以将小数天( 0.0-0.99999.. )转换为人类0.0-0.99999..格式(小时,分钟,秒;但更重要的是:毫秒,微秒,纳秒)。 转换是通过以下function完成的:(请注意,我还没有实现时区校正) d = lambda x: decimal.Decimal(str(x)) cdef object fractional2hms(double fractional, double timezone): cdef object total, hms, ms_mult cdef int i hms = [0,0,0,0,0,0] ms_mult = (d(3600000000000), d(60000000000), d(1000000000), d(1000000), d(1000), d(1)) # hms = [0,0,0,0,0] total = d(fractional) * d(86400000000000) for i in range(len(ms_mult)): hms[i] = (total – (total % ms_mult[i])) […]

Python C-API对象分配

我想使用new和delete运算符来创建和销毁我的对象。 问题是python似乎将其分解为几个阶段。 用于创建的tp_new,tp_init和tp_alloc以及用于销毁的tp_del,tp_free和tp_dealloc。 但是c ++只有new,它分配并完全构造对象和删除对象的析构和解除分配。 我需要提供哪些python tp_ *方法以及它们必须做什么? 此外,我希望能够直接在c ++中创建对象,例如“PyObject * obj = new MyExtensionObject(args);” 我是否还需要以某种方式重载新运算符以支持此操作? 我也希望能够在python中inheritance我的扩展类型,我需要做些什么来支持它? 我正在使用python 3.0.1。 编辑:好的,tp_init似乎使对象有点太可变了我正在做的事情(例如,使用一个Texture对象,在创建后更改内容很好,但更改它的基本方面,如size,bitdept等会破坏很多现有的c ++东西都假定了那些东西是固定的)。 如果我不实现它,它只会阻止人们在构造之后调用__init__(或者至少忽略调用,就像元组一样)。 或者,如果在同一对象上多次调用tp_init,我是否应该有一些抛出exception或某事的标志? 除此之外,我认为其余的大部分已经排序。 extern “C” { //creation + destruction PyObject* global_alloc(PyTypeObject *type, Py_ssize_t items) { return (PyObject*)new char[type->tp_basicsize + items*type->tp_itemsize]; } void global_free(void *mem) { delete[] (char*)mem; } } template class ExtensionType { PyTypeObject […]

Numpy C API:链接多个目标文件

我正在使用numpy的C API来编写一些用于矩阵计算的函数。 今天我想将我的函数的某些部分移动到一个单独的.c文件中,并使用标头来声明它们。 现在我有一个与numpy的import_array函数有关的奇怪问题。 我试图尽可能地简化问题。 起初有工作计划: mytest.c #include “mytest.h” PyObject* my_sub_function() { npy_intp dims[2] = {2, 2}; double data[] = {0.1, 0.2, 0.3, 0.4}; PyArrayObject* matrix = (PyArrayObject*)PyArray_SimpleNew(2, dims, NPY_FLOAT64); memcpy(PyArray_DATA(matrix), data, sizeof(double) * dims[0] * dims[1]); return (PyObject*)matrix; } static PyObject* my_test_function(PyObject* self, PyObject* args) { return my_sub_function(); } static PyMethodDef methods[] = { […]

嵌入python

我试图从C代码调用python函数,我从这里跟随样本 我也有正确的包含文件目录,库目录,并链接python32.lib(即时使用python 32)但是错误是python / C API,如PyString_FromString,PyInt_FromLong,PyInt_AsLong未定义(调试器中的错误) 这很奇怪,因为我也使用其他API,但它们都很好…… 这是什么问题? int main(int argc, char *argv[]) { PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; int i; if (argc < 3) { fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); return 1; } Py_Initialize(); pName = PyString_FromString(argv[1]); /* Error checking of pName left out */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule […]

使用C API创建在python中声明的python类的实例

我想创建一个使用C API在__main__范围内定义的Python类的实例。 例如,该类称为MyClass ,定义如下: class MyClass: def __init__(self): pass 类类型位于__main__范围内。 在C应用程序中,我想创建此类的实例。 这可能是PyInstance_New可以实现的,因为它需要类名。 但是这个function在Python3中不可用。 任何对替代品的帮助或建议都表示赞赏。 谢谢,保罗