如何正确使用 Python'的 C API 和异常?
如果我做 之类的事情 >>> x = int(1,2,3,4,5) 我立即遇到致命错误(如果是在预先编写的脚本中,将结束程序执行) Traceback (most recent call last): File "", line 1, in TypeError: int() takes at most 2 arguments (5 given) 和x仍然不确定: >>> x Traceback (most recent call last): File "", line 1, in NameError: name 'x' is not defined 我将如何在Python的C API中实施它?我找到了一些文档为此,但我不确定我知道如何正确使用它. 这是我一直在尝试的: 打印: if(something) { PyErr_SetString(PyE
0 2024-03-01
编程技术问答社区
如何使用Python for .NET正确嵌入
当我尝试使用 时 PythonEngine.ImportModule(mymodulename) 尝试加载依赖项中的某些可选模块(在不嵌入的情况下使用模块不需要).由于不需要这些可选的依赖性,因此这是从此方法中返回的,因此不可用.在此Pythonnet API中使用的适当方法是什么? 解决方案 看来我的问题只是在没有扩展的情况下导入模块(.py).非常愚蠢的错误,但希望这对以pythonnet开头的其他人有帮助. 对于带有.py(c)扩展名的单文件模块,需要完整的文件名,包括扩展名. 对于软件包(带有__init__.py和其他文件的目录,子目录)仅需要包名称.
0 2024-01-07
编程技术问答社区
Python for .NET "无法找到程序集 "错误
我正在使用cpython,我有一个c#dll.我正在尝试使用python进行.net使他们说话.我不能使用Ironpython,因为我需要将其集成到现有的Cpython系统中. 我完全是python的.NET,实际上我对Python的经验很少,并且没有C#的经验.因此,如果我的问题似乎很基本,请原谅我. 我正在使用Python 2.7.3,然后我下载了 pythonnet-2.0-alpha2-clr2.0_131_py27_ucs2,然后将其拉开为一个名为pyfornet_test的文件夹,其中还包含我要使用的dll(dotnet4class.dll) 然后我运行: import sys import os import clr sys.path.append(r"C:\pyfornet_test") clr.AddReference("DotNet4Class.dll") 给我这个错误: System.IO.FileNotFoundExcep
16 2024-01-03
编程技术问答社区
来自SWIG的PyObject_Call Segfault的Python回调
我有一个wx.py.shell.shell.shell窗口小部件,该小部件使用户可以执行与程序交互的Python代码.我希望能够将用户在此空间中定义的函数传递给我的C ++代码(通过我的自定义小部件周围的WXSWIG生成的包装器)并执行它. 在我的C ++代码中,我正在使用std :: function 类调用界限功能(C ++或Python) 因此,我创建了一个简单的类,用功能调用操作员包裹PyObject.但是,当我尝试调用PyObject *. 时,我会得到一个segfault class PyMenuCallback { PyObject *Func; public: PyMenuCallback(const PyMenuCallback &op2); PyMenuCallback(PyObject *func); ~PyMenuCallback (); void operator() (int id); }; /////
24 2023-12-15
编程技术问答社区
如何在Python中处理PyCapsule类型的问题
我正在尝试通过 传递对象 QtGui.QWidget.effectiveWinId() to win32gui.SetWindowLong() 有效Winid()正在返回: 和setWindowlong()期望一个pyhandle(Doc说,也应该接受整数) TypeError: The object is not a PyHANDLE object 所以我的问题是如何从pycapsule对象中获取价值并检查其无效? pycapsule似乎是C代码的所有内部API. 我还发现这个错误可以做类似于我想要的python的2.x pycobject,它在python 3.x中不存在: http://srinikom.github.io/pyside-bz-archive/show_bug.cgi?id=523#c18 解决方案 好
18 2023-12-04
编程技术问答社区
初始化器不是一个常量,错误C2099,在编译一个用C语言编写的Python模块时
我试图编译一个名为距离距离,Whith c c"的python模块. python设置. CDISTANCE/DEMANST.C(647):错误C2099:初始化器不是 常数 CDISTANCE/DEMANST.C(689):错误C2099:初始化器不是 常数 错误:命令'c:\ program文件(x86)\ Microsoft Visual Studio \ 2017 \ buildTools \ vc \ tools \ msvc \ 14.10.25017 \ bin \ hostx64 \ x64 \ cl .exe'失败,出口状态2 这是第647行上的代码 646 PyTypeObject IFastComp_Type = { 647 PyVarObject_HEAD_INIT(&PyType_Type, 0) 648 "distance.ifast_comp", /* tp_name */ 649 sizeo
8 2023-11-20
编程技术问答社区
numpy数组C api
我有一个c ++函数返回std :: vector,我想在python中使用它,所以我使用的是c numpy api: static PyObject * py_integrate(PyObject *self, PyObject *args){ ... std::vector integral; cpp_function(integral); // This changes integral npy_intp size = {integral.size()}; PyObject *out = PyArray_SimpleNewFromData(1, &size, NPY_DOUBLE, &(integral[0])); return out; } 这是我从python称呼它的方式: import matplotlib.pyplot as plt a = py_integrate(parameters)
0 2023-11-17
编程技术问答社区
从C语言创建一个实现了__dict__的Python类型?
如何根据"正常"类创建__dict__的类型是在python中定义的吗? 有没有__dict__ s? 的非动态类型的例子 DO类型通过Python的 有tp_dict的成员PyTypeObject,但我找不到有关其使用方式的信息.在typeobject.c's type_new中似乎也发生了一些事情,但我不能清楚地破译. 这是我发现的一些相关信息: 如何在Python中实现__slots__? 解决方案 以下代码将生成一个在Python 2.x中实现A __dict__的类: typedef struct { PyObject_HEAD PyObject* dict; } BarObject; static PyTypeObject BarObject_Type = { PyObject_HEAD_INIT(NULL) }; PyMODINIT_FUNC initFoo(void) { PyObject *m; m = Py_I
6 2023-10-30
编程技术问答社区
PyTuple_SetItem的局限性
我有一个Python扩展模块,该模块将元组作为另一个对象的属性创建元组,并在元组中设置项目.每当我在python中执行此模块时,我都会不断获得错误SystemError: bad argument to internal function 在阅读了PyTuple的文档并进行了几个小时的调试之后,我仍然无法弄清楚到底是怎么回事.通过调试器运行我的程序表明该问题发生在Python解释器内的库呼叫中.因此,最后,我查看了Python源代码,最后我意识到了这个问题. PyTuple_SetItem功能具有一个有趣的限制,我不知道,并且找不到明确的记录. 这是Python源中的重要功能(为清晰度编辑): int PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem) { ..... if (!PyTuple_Check(op) || op->ob_refcnt
6 2023-10-27
编程技术问答社区
函数调用时PyObject发生分离故障
我正在尝试使用Python打开对话框,以接受我的C ++应用程序的输入. 这是我想做的事情的非常最小的表示: #include #include int main() { /* Begin Python Ititialization - only needs to be done once. */ PyObject *ip_module_name = NULL; PyObject *ip_module = NULL; PyObject *ip_module_contents = NULL; PyObject *ip_module_getip_func = NULL; Py_Initialize(); PyEval_InitThreads(); ip_module_name = PyString_FromString( "get_ip" ); ip_
22 2023-10-23
编程技术问答社区
当导入一个嵌入Python的SWIG模块时,"没有名为'_<module>'的模块"
我试图将SWIG与嵌入式Python 3.5.2一起使用.以下是作为Windows控制台应用程序构建的.当它试图导入C ++侧Swig模块" _arpy"时,它将无法初始化Python侧Swig模块" arpy.py".我(可能不正确的)理解C ++端" _arpy"模块应该已经由SWIG模块INIT函数加载,但似乎并非如此. arpy.i: %module arpy %{ #include "arpy.h" %} %include int test(); arpy.h: #pragma once int test(); swig -python -c++ arpy.i生成: arpy_wrap.cxx arpy.py main.cpp: #include extern "C" PyObject* PyInit__arpy(); int main() { Py_Initialize(
18 2023-10-10
编程技术问答社区
返回Python C API中新的自定义类对象的列表
我需要通过python c api创建一个新列表,其中包含我写过的Quaternion类的对象的新副本(在C ++中). [实际上,我真的很喜欢数组,但是任何类型的序列都会做.我对指针很糟糕,所以这并不令人惊讶.我认为也许我需要用new> 来赋予创建对象的Python所有权. 到目前为止,我得到的最好的东西出现在下面.我不应该在new时复制构造四元素吗?我在做其他愚蠢的事情吗?我现在需要告诉Python它现在拥有该参考吗?返回的清单是否应该存在并过着幸福的生活? PyObject* Objectify(std::vector& v) { Py_ssize_t size = v.size(); PyArrayObject* list = (PyArrayObject*) PyList_New(size); for(Py_ssize_t i=0; i
10 2023-10-10
编程技术问答社区
从Python向C语言传递结构数组
[更新:解决问题!请参阅帖子的底部] 我需要允许Python开发人员将一系列包装的数据(在本例中为顶点)传递到我的API中,这是通过Python C API手动暴露的一系列C ++接口.我对此的最初印象是使用CTYPES结构类允许这样的接口: class Vertex(Structure): _fields_ = [ ('x', c_float), ('y', c_float), ('z', c_float), ('u', c_float), ('v', c_float), ('color', c_int) ] verts = (Vertex * 3)() verts[0] = Vertex(0.0, 0.5, 0.0, 0.0, 0.5, 0xFF0000FF) verts[1] = Vertex(0.5, -0.5, 0.0, 0.5, -0.5, 0x00FF00FF) verts[2] = Vertex(-0.5,
6 2023-10-04
编程技术问答社区
在一个动态分配的结构(数组的结构)中分配一个动态数组
这个问题实际上是关于如何在Python/C API中使用可变长度类型( PyObject_NewVar , PyObject_VAR_HEAD , >和.tp_itemsize ,但是我可以问这个问题,而不会打扰API的细节.只需假设我需要在struct中使用数组. 我可以通过两种方式之一创建列表数据结构. (我现在只谈论char列表,但这没关系.)第一个使用指针,需要两个分配.忽略#include s和错误处理: struct listptr { size_t elems; char *data; }; struct listptr *listptr_new(size_t elems) { size_t basicsize = sizeof(struct listptr), itemsize = sizeof(char); struct listptr *lp; lp = malloc(basicsize); lp->elem
10 2023-10-03
编程技术问答社区
C语言扩展-如何将printf重定向到python记录器?
我有一个简单的C扩展(请参见下面的示例),有时使用printf函数打印. 我正在寻找一种从该c延伸的呼叫的方法,以便将所有这些printf重定向到我的python logger. hello.c: #include static PyObject* hello(PyObject* self) { printf("example print from a C code\n"); return Py_BuildValue(""); } static char helloworld_docs[] = "helloworld(): Any message you want to put here!!\n"; static PyMethodDef helloworld_funcs[] = { {"hello", (PyCFunction)hello, METH_NOARGS, helloworld_docs}, {NULL
4 2023-09-29
编程技术问答社区
如何在 Python 中重定向 stderr?通过 Python C API?
这是我最近两个问题的结合: [1] c python实例方法 [2] 如何在Python中重定向stderr? 我想从python脚本记录stdout和stderr的输出. 我要问的是,根据[1]创建一种新类型似乎相当复杂.如果不需要将新类型暴露于Python,即仅在C? 中才能简化事物. 我的意思是,当python打印出某些内容时,它将转到" objects/fileobject.c",然后在" pyfile_writeObject"中查看是否可以写入其参数: writer = PyObject_GetAttrString(f, "write"); if (writer == NULL) ... 另外,有可能像这样获得Stdout和stderr: PyObject* out = PySys_GetObject("stdout"); PyObject* err = PySys_GetObject("stderr"); 我的问题是,是否有可能构造满足
60 2023-09-29
编程技术问答社区
为扩展方法添加带有注解的签名
在我的应用程序中嵌入Python并编写扩展类型时,我可以通过使用正确精心设计的.tp_doc字符串将signature添加到该方法中. static PyMethodDef Answer_methods[] = { { "ultimate", (PyCFunction)Answer_ultimate, METH_VARARGS, "ultimate(self, question='Life, the universe, everything!')\n" "--\n" "\n" "Return the ultimate answer to the given question." }, { NULL } }; 执行help(Answer)时,返回以下内容(缩写): class Answer(builtins.object) | | ultimate(self, question='Life, the universe, eve
6 2023-09-03
编程技术问答社区
c++0x std::shared_ptr vs. boost::shared_ptr
我有一个大量使用shared_ptr和stl的C ++代码.一个普通标题说 #include using boost::shared_ptr; // for shared_ptr using namespace std; // for STL 我现在想切换到C ++ 0x,以使用的GCC 4.6使用语言功能.但是,现在也有std::shared_ptr,导致未指定shared_ptr的歧义(boost::shared_ptr vs std::shared_ptr). 切换到std::shared_ptr时,如下: #include using namespace std; // for STL; also imports std::shared_ptr 然后,我遇到了boost::python的问题,boost::python仅适用于boost::shared_ptr(至少没有进一
6 2023-09-01
编程技术问答社区
如何在安装软件包时包含(脚本构建的)库?
我正在制作一个带有C ++扩展模块的Python软件包,以及其他人所需的共享库.我希望所有内容都可以通过pip安装.当我使用pip install -e .时,我当前的setup.py文件有效在Python.我相信原因是Setuptools不认为共享库是我的软件包的一部分,因此在将文件复制到安装目录时,在安装过程中打破了库的相对链接. . 这是我的setup.py文件的样子: from setuptools import setup, Extension, Command import setuptools.command.develop import setuptools.command.build_ext import setuptools.command.install import distutils.command.build import subprocess import sys import os # This function downloads and
16 2023-08-31
编程技术问答社区
如何使用同名的setuptools包和ext_modules?
我有以下我的Python C扩展项目的文件结构: . ├── setup.py ├── source ├── cppimplementation │ └── fastfile.cpp └── fastfilepackage ├── __init__.py └── version.py 我使用以下setup.py文件: from setuptools import setup, Extension setup( name= 'fastfilepackage', version= '0.1.1', package_dir = { '': 'source', }, packages = [ 'fastfilepackage', ], ext_modules
12 2023-08-31
编程技术问答社区