Tag: python 3.x

嵌入Python 3.3

我尝试嵌入Python 3.3,如此处所述。 我在使用Python 2.7的MacOS 10.8上,所以我从python.org下载了3.3版的二进制发行版。 从它我得到了所有标题和“Python”,我重命名为“python33”所以它不会与安装的“Python”lib发生冲突。 我把所有东西放到一个文件夹中 embed.c / include python33 “文件python33”说: python33 (for architecture i386): Mach-O dynamically linked shared library i386 python33 (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 和embed.c是: #include int main(int argc, char *argv[]) { Py_Initialize(); PyRun_SimpleString(“print ‘test’\n”); Py_Finalize(); return 0; } 但是当我做“gcc embed.c -I./include -L.-lpython33”时,它打破了: ld: library not […]

使用ctypes从Python中的C函数返回的结构中访问数据

我知道这个问题已经得到了处理,但我找不到任何对我有用的东西,所以我猜我的问题与其他问题略有不同。 基本上,我所做的是使用ctypes将C函数包装到python代码中。 我的目标是在C函数中计算一些数量,将它们存储到一个结构中,然后在Python中返回结构,我可以在其中读取结构中的所有不同数据。 所以: 要在python中定义我的结构,我使用: class BITE(ctypes.Structure): _fields_ = [ (“lum”, ctypes.c_int), (“suce”, ctypes.c_int) ] 我这样编译: sub.call([“gcc”,”-shared”,”-Wl,-install_name,ex.so”,”-o”,”ex.so”,”-fPIC”,”ex.c”]) lum = ctypes.CDLL(‘ex.so’) lum = lum.lum 我声明参数和结果类型如下: lum.restype = ctypes.POINTER(BITE) lum.argtypes = [ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.c_float,ctypes.c_float,ctypes.c_float,ctypes.c_float,ctypes.c_float] 然后,我在python代码中调用C函数“lum” out = lum(all the different variables needed) 问题从这里开始。 我有我的结构,但无法读取存储在每个字段中的数据。 我找到的部分解决方案是: out = out[0] 但是,在做的时候 print(out.suce) 我有一个分段错误11.不知道为什么。 我试图理解如何使用create_string_buffer,但我真的不明白它是如何工作的以及它应该做什么。 而且,我试图用作黑盒子,但仍然无效。 我还尝试了其他线程中提到的一些其他解决方案,例如使用out.contents或类似的东西,但它没有.contents属性。 也不是out.suce.value,这也是我在绝望的研究中看到的东西。 当然,我在C代码中检查了结构是否存在以及结构的每个字段是否存在,并且其中包含正确的数据。 谢谢。

在C中嵌入Python:链接时出错 – 对PyString_AsString的未定义引用

我试图在C程序中嵌入一个python程序。 我的操作系统是Ubuntu 14.04 我尝试在相同的C代码库(作为单独的应用程序)中嵌入python 2.7和python 3.4解释器。 编译和链接在嵌入python 2.7时有效,但不适用于python 3.4。 它在链接器阶段失败。 这是我的C代码(只是一个例子不是真正的代码) simple.c #include #include int main(int argc, char *argv[]) { PyObject *pName, *pModule, *pFunc, *pValue; char module[] = “get_version”; char func[] = “get_version”; char module_path[] = “.”; Py_Initialize(); PyObject *sys_path = PySys_GetObject(“path”); PyList_Append(sys_path, PyUnicode_FromString(module_path)); pName = PyUnicode_FromString(module); pModule = PyImport_Import(pName); Py_DECREF(pName); if(pModule != NULL) { […]

从Python线程生成时,为什么子进程的输出会延迟?

这是我昨天发布的扩展,现在还没有解决: 为什么我的子程序的Python线程没有按预期工作? 与此同时,我发现了一些有趣的细节,所以我决定创建一个新post。 为了实现这一点:当从线程生成子进程时,存在一些问题。 平台:Windows 7企业版,Python 3.6.1 在下面的代码中,我想运行一个C-executable并将其输出到stdout成一个字符串。 出于测试目的,可执行文件接受两个参数:延迟和文件名(此处未使用)。 程序将Sleep now写入stdout ,睡眠给定的毫秒数,最后after sleep和END after sleep写入。 这是可执行文件的C源代码: int main(int argc, char *argv[]) { int sleep = 0; FILE * outfile = NULL; if (argc > 1) { sleep = atoi(argv[1]); } if (argc > 2) { outfile = fopen(argv[2], “w”); } printf(“Sleep now…\n”); Sleep(sleep); if (outfile) […]

从C线程调用Python代码

当从C(或C ++)线程调用Python代码时,我对如何确保线程安全性感到非常困惑。 Python文档似乎在说,通常这样做的习惯是: PyGILState_STATE gstate; gstate = PyGILState_Ensure(); /* Perform Python actions here. */ result = CallSomeFunction(); /* evaluate result or handle exception */ /* Release the thread. No Python API allowed beyond this point. */ PyGILState_Release(gstate); 事实上,这个stackoverflow答案似乎也证实了这一点。 但是一位评论者(声誉很高)却说不然。 评论者说你应该使用PyEval_RestoreThread() / PyEval_SaveThread() 。 文档似乎证实了这一点: PyThreadState* PyEval_SaveThread() Release the global interpreter lock (if it has been […]

从C创建一个实现__dict__的Python类型?

根据“正常”类创建的__dict__类型是如何在Python中定义的? 有没有__dict__ s的非动态类型的例子? 通过Python的type_new定义的类型是否通过type_new ? tp_dict有一个tp_dict成员,但我找不到有关如何使用它的信息。 在typeobject.c的type_new似乎也有一些事情发生,但我无法清楚地解读它。 以下是我发现的一些相关信息: inheritance自C扩展模块的类中的__dict__ 如何在Python中实现__slots__?

Python:GIL上下文 – 切换

所以,我通常非常了解Python中的全局解释器锁 (GIL)是如何工作的。 本质上,当解释器运行时,一个线程保持GIL为N刻度(其中N可以使用sys.setcheckinterval设置),此时GIL被释放而另一个线程可以获取GIL。 如果一个线程开始I / O操作,也会发生这种情况。 我有点困惑的是这一切是如何与C扩展模块一起工作的。 如果你有一个C扩展模块获取GIL,然后使用PyEval_EvalCode执行一些python代码,解释器PyEval_EvalCode可以释放GIL并将其提供给其他线程? 或者,获取GIL的C线程是否会永久保持GIL,直到PyEval_EvalCode返回并且GIL在C中明确释放? PyGILState gstate = PyGILState_Ensure(); …. /* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */ PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); PyGILState_Release(gstate);

如何使用Python优雅地发送/接收大型C结构?

我已经开始编写Python 3.x客户端应用程序了。 服务器应用程序已经存在并用C语言编写。服务器提供了一个C头文件,其中包含两个用于通过UDP发送和接收数据的结构的定义(我正在使用Python的socket模块)。 问题是C结构非常大(每个大约200个元素)。 如果我使用Python的struct模块来打包/解包数据,那么一个不那么优雅的解决方案就是手动打包/解包200个元素,如: struct.pack(‘H…I’, data1, …, data200) 此外,我希望能够使用类似C的语法访问Python中的接收/发送元素。 例如,如果我在C服务器端 send.data.pos = pos; 如果我可以像这样访问Python客户端中的pos变量,那将是很好的(最自然的): pos = recv.data.pos 请注意,问题不在于如何从头文件中自动编写Python结构,就像在这个线程中一样(我在Python中逐个编写每个结构字段没有问题),而是什么是最好的组织方式Python中的数据(例如在类中,使用字典等),这将允许我利用Pythonfunction并使代码更简单,数据易于访问(我宁愿只使用Python标准模块,也不使用外部软件)。 实现这一目标最优雅的方法是什么?

使用ctypes将python字符串对象转换为c char *

我试图使用ctypes从Python(3.2)向C发送2个字符串。 这是我的Raspberry Pi上项目的一小部分。 为了测试C函数是否正确接收到字符串,我将其中一个放在文本文件中。 Python代码 string1 = “my string 1” string2 = “my string 2” # create byte objects from the strings b_string1 = string1.encode(‘utf-8’) b_string2 = string2.encode(‘utf-8’) # send strings to c function my_c_function(ctypes.create_string_buffer(b_string1), ctypes.create_string_buffer(b_string2)) C代码 void my_c_function(const char* str1, const char* str2) { // Test if string is correct FILE *fp = fopen(“//home//pi//Desktop//out.txt”, […]

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 […]