标签: python-extensions

当类实现PEP 3118时,Python 2.7中PyBufferProcs的定义

我正在扩展我们的库(支持Python 2.7)中的类以支持PEP 3118,后者已经被反向移植到2.7.

从文档中,我需要初始化tp_as_buffer字段以指向a PyBufferProcs.但是,从2.7的文档中,此结构的描述仅包含旧缓冲区协议的条目.从来源,我收集的是 PyBufferProcs对新协议(一些其他的项目bf_getbufferbf_releasebuffer).

问题仍然存在:

  • 我是否必须做一些特别的事情来告诉Python这些新条目是否有效?

  • 我是否必须填写旧协议的条目?(例如,2.7的文档说明bf_getsegcount 可能不为空.但如果我支持PEP 3118,则不应使用此条目.)

python python-c-api pybuffer python-extensions pep3118

9
推荐指数
1
解决办法
422
查看次数

Py_BuildValue:用bool制作元组?

我在docs中看到,我可以使用int(指定'i')构建元组值.我需要用bool制作元组,例如(True, 10).如何用bool制作这样的元组(需要什么说明符)?

python python-extensions

9
推荐指数
1
解决办法
2747
查看次数

从C定义Python类

我为Python包装了一些C代码,它可以工作.C模块创建一个句柄,我将其传递给Python PyCapsule.我想要的API可以用Python制作:

import wrapped

class Test(object):
   def __init__(self, loc ):
      self.handle = wrapped.new(loc)

   def foo(self, data):
      return wrapped.foo(self.handle, data)

所以这个问题更像是一个美容问题.我是否必须包装包装器,或者我可以将上面显示的代码移动到C代码中,即导出类而不是一堆函数?

c python-c-api python-2.7 python-extensions

8
推荐指数
2
解决办法
2146
查看次数

.so模块在python中没有导入:动态模块没有定义init函数

我正在尝试为C函数编写一个python包装器.在编写完所有代码并将其编译后,Python无法导入该模块.我按照这里给出的例子.在修复一些拼写错误后,我在这里重现它.有一个文件myModule.c:

#include <Python.h>

/*
 * Function to be called from Python
 */
static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
    char *s = "Hello from C!";
    return Py_BuildValue("s", s);
}
/*
 * Bind Python function names to our C functions
 */
static PyMethodDef myModule_methods[] = {
    {"myFunction", py_myFunction, METH_VARARGS},
    {NULL, NULL}
};

/*
 * Python calls this to let us initialize our module
 */
void initmyModule()
{
    (void) Py_InitModule("myModule", myModule_methods);
}
Run Code Online (Sandbox Code Playgroud)

由于我在使用Macports python的Mac上,我将其编译为

$ g++ -dynamiclib -I/opt/local/Library/Frameworks/Python.framework/Headers -lpython2.6 -o …
Run Code Online (Sandbox Code Playgroud)

c c++ python python-c-api python-extensions

7
推荐指数
1
解决办法
8510
查看次数

数据损坏:错误在哪里‽

最后编辑:我已经弄清楚问题是什么(请参阅下面我自己的答案),但我无法将问题标记为已回答的问题.如果有人可以回答我在下面的答案中提出的问题,也就是说,这是Cython中的错误还是Cython的预期行为,我会将该答案标记为已接受,因为这将是最有用的教训,恕我直言.


首先,我必须首先说我已经试图解决这个问题三天了,而我只是把头靠在墙上.从文档中我可以看出,我正在做正确的事情.显然,我不能正确地做事,因为如果我是,我就不会有问题(对吧?).

无论如何,我正在为mcrypt绑定到Python.它应该适用于Python 2和Python 3(虽然它未经Python 2测试).它可以在我的网站上找到,因为它太大而无法包含在帖子中,并且考虑到我不知道我做错了什么,我甚至无法隔离可能存在问题的代码.显示问题的脚本也在我的网站上.该脚本只提供100个块,只有字母"a"(无论加密算法/加密模式使用的块大小),当然应该得到一个"a"块作为往返的结果.但它(不总是).以下是单次运行的输出:

Wed Dec 15 10:35:44 EST 2010
test.py:5: McryptSecurityWarning: get_key() is not recommended
  return ''.join(['{:02x}'.format(x) for x in o.get_key()])

key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
16
self test result: 0
enc parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
dec parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
enc key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
dec key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
Stats: 88 / 100 good packets (88.0%)

#5: b'aaaaaaaaaaaaaaaa' != b'\xa6\xb8\xf9\td\x8db\xf6\x00Y"ST\xc6\x9b\xe7'
#6: …
Run Code Online (Sandbox Code Playgroud)

python mcrypt cython python-extensions

7
推荐指数
1
解决办法
568
查看次数

Cython对进口做了什么?

我想创建一个Python扩展,我真的很喜欢使用Cython.主要是为了获得更多关于它的知识,并利用速度增益,如果有的话.我已经阅读了相当多的Cython文档,但我还不是计算机科学家(还),并且没有深入的知识来理解低级基础知识,因此我提出以下问题的原因:

我只是想知道,如果我在我正在开发的Python扩展中使用外部导入(例如,ORM或SQL库或任何其他第三方库)会发生什么?

Cython如何处理它?

如果这个导入的库/扩展名是纯Python还是编译它会有区别吗?

处理这个问题的正确方法是什么?

谢谢.

PS.问题以粗体显示.

c python python-module cython python-extensions

7
推荐指数
1
解决办法
719
查看次数

python-C++扩展可以获得一个C++对象并调用其成员函数吗?

我正在编写一个python/C++应用程序,它将从python中调用C++扩展中的方法.

说我的C++有一个类:

class A
{
    private:
        int _i;
    public:
        A(int i){_i=i;}
        int get_i(){return _i;}
}

A a=A();
Run Code Online (Sandbox Code Playgroud)

无论如何,python可以a在C++中获取对象并调用其成员函数,即:

import cpp_extension
a=cpp_extension.A()
print a.get_i()
Run Code Online (Sandbox Code Playgroud)

任何对一般阅读的提及也表示赞赏.

c++ python python-extensions

7
推荐指数
2
解决办法
2749
查看次数

使用向后兼容 (MacOS10.9+) 的 MacOS 10.15 (Catalina) 创建 Python C 扩展

如何使用 MacOS 10.15 为向后兼容(MacOS 10.9+)的 MacOS 创建 Python C 扩展轮?

这是我到目前为止:

export MACOSX_DEPLOYMENT_TARGET=10.9
python -m pip wheel . -w wheels --no-deps
python -m pip install delocate
for whl in wheels/*.whl; do
    delocate-wheel -w wheels_fixed -v "$whl"
done
Run Code Online (Sandbox Code Playgroud)

不幸的是,pip wheel生成一个文件myapp-0.0.1-cp37-cp37m-macosx_10_15_x86_64.whl,与auditwheelLinux不同的是,delocate-wheel它不会修改轮子的名称。因此,如果我使用 将其上传到 PyPI 上twine,则只有使用 MacOS 10.15 的用户才能使用pip. 我想我可以手动将其重命名为myapp-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl,但这对我来说听起来不对。

对于构建,我只使用 GitHub Actions MacOS 虚拟机。

谢谢你。

PS:构建使用的编译器是GCC9

python macos pypi python-extensions python-wheel

7
推荐指数
1
解决办法
333
查看次数

如何为已编译的 Python 扩展生成 .pyi 文件?

我使用.pydC++ 和pybind11. 我想.pyi为我的项目生成一个 Python 接口文件.pyd

有几个类似的问题涉及该mypy stubgen模块,但是,这个问题会产生一个UnicodeError尝试运行文件stubgen Dummy在哪里DummyDummy.pyd问题:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x90 in position 2: invalid start byte

另一个项目make-stub-files根本不处理.pyd文件,给出('not a python file'文件,从而出现错误。

是否有任何工具可以让我从源.cpp文件或编译后生成 .pyi 文件.pyd文件生成 .pyi 文件?

该问题已在mypyGitHub 存储库中注册。

python python-extensions mypy typeshed

6
推荐指数
1
解决办法
5832
查看次数

调用setup.py安装时如何将--debug传递给build_ext?

当我执行一个命令python setup.py install或者python setup.py develop它会执行build_ext命令作为步骤之一。如何将--debug选项传递给它,就像它被调用一样python setup.py build_ext --debug

更新这里setup.py与我的非常相似:https : //github.com/pybind/cmake_example/blob/11a644072b12ad78352b6e6649db9dfe7f406676/setup.py#L43

我想调用python setup.py install但将类实例中的debug属性设置build_ext为 1。

python distutils setuptools python-extensions

6
推荐指数
1
解决办法
1901
查看次数