我正在扩展我们的库(支持Python 2.7)中的类以支持PEP 3118,后者已经被反向移植到2.7.
从文档中,我需要初始化tp_as_buffer字段以指向a PyBufferProcs.但是,从2.7的文档中,此结构的描述仅包含旧缓冲区协议的条目.从来源,我收集的是
PyBufferProcs对新协议(一些其他的项目bf_getbuffer和bf_releasebuffer).
问题仍然存在:
我是否必须做一些特别的事情来告诉Python这些新条目是否有效?
我是否必须填写旧协议的条目?(例如,2.7的文档说明bf_getsegcount
可能不为空.但如果我支持PEP 3118,则不应使用此条目.)
我在docs中看到,我可以使用int(指定'i')构建元组值.我需要用bool制作元组,例如(True, 10).如何用bool制作这样的元组(需要什么说明符)?
我为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包装器.在编写完所有代码并将其编译后,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) 最后编辑:我已经弄清楚问题是什么(请参阅下面我自己的答案),但我无法将问题标记为已回答的问题.如果有人可以回答我在下面的答案中提出的问题,也就是说,这是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扩展,我真的很喜欢使用Cython.主要是为了获得更多关于它的知识,并利用速度增益,如果有的话.我已经阅读了相当多的Cython文档,但我还不是计算机科学家(还),并且没有深入的知识来理解低级基础知识,因此我提出以下问题的原因:
我只是想知道,如果我在我正在开发的Python扩展中使用外部导入(例如,ORM或SQL库或任何其他第三方库)会发生什么?
Cython如何处理它?
如果这个导入的库/扩展名是纯Python还是编译它会有区别吗?
处理这个问题的正确方法是什么?
谢谢.
PS.问题以粗体显示.
我正在编写一个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)
任何对一般阅读的提及也表示赞赏.
如何使用 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
我使用.pydC++ 和pybind11. 我想.pyi为我的项目生成一个 Python 接口文件.pyd。
有几个类似的问题涉及该mypy stubgen模块,但是,这个问题会产生一个UnicodeError尝试运行文件stubgen Dummy在哪里Dummy的Dummy.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 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 ×9
c ×3
python-c-api ×3
c++ ×2
cython ×2
distutils ×1
macos ×1
mcrypt ×1
mypy ×1
pep3118 ×1
pybuffer ×1
pypi ×1
python-2.7 ×1
python-wheel ×1
setuptools ×1
typeshed ×1