标签: python-cffi

如何将Numpy数组传递给cffi函数以及如何将其返回?

我正在使用Python和Numpy开发音频算法.现在我想通过在C中实现它的一部分来加速该算法.在过去,我使用cython完成了这个.现在我想用新的cffi做同样的事情.

出于测试目的,我写了一个简单的C函数:

void copy(float *in, float *out, int len) {
    for (int i=0; i<len; i++) {
        out[i] = in[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建两个numpy数组,并由这个函数处理.我想出了一种方法:

import numpy as np
from cffi import FFI

ffi = FFI()
ffi.cdef("void copy(float *in, float *out, int len);")
C = ffi.dlopen("/path/to/copy.dll")

float_in = ffi.new("float[16]")
float_out = ffi.new("float[16]")

arr_in = 42*np.ones(16, dtype=np.float32)

float_in[0:16] = arr_in[0:16]
C.copy(float_in, float_out, 16)
arr_out = np.frombuffer(ffi.buffer(float_out, 16*4), dtype=np.float32)
Run Code Online (Sandbox Code Playgroud)

但是,我想改进这段代码:

  1. 有没有办法直接访问numpy数组的底层浮点缓冲区而不复制它们?
  2. ffi.buffer非常方便快速转换为C数组的内容到Numpy数组.是否有一种等效方法可以快速将numpy数组转换为C数组而无需复制单个元素?
  3. 对于某些应用程序,float_in[0:16] = arr_in[0:16]是一种访问数据的便捷方式.相反,arr_out[0:16] = float_out[0:16] …

python arrays numpy python-cffi

26
推荐指数
3
解决办法
7006
查看次数

如何使用python wheel包包含外部库

我想创建python包,.so在Linux上使用cffi模块嵌入和使用外部库().

有没有标准的方法将.so文件包含到python包中?

该软件包仅在内部使用,不会发布到pypi.

我认为Wheel包是最好的选择 - 他们会创建特定于平台的包,所有文件都可以复制,因此不需要在目标环境中构建任何东西.

python shared-libraries python-cffi python-wheel

20
推荐指数
2
解决办法
5385
查看次数

osx上的pip cffi包安装失败

我正在安装用于加密和Jasmin安装的cffi包.

在发布问题之前我做了一些研究,所以我找到了以下选项,但似乎没有用:

系统

Mac OSx 10.9.5

python2.7

错误

c/_cffi_backend.c:13:10: fatal error: 'ffi.h' file not found

#include <ffi.h>

         ^

1 warning and 1 error generated.
Run Code Online (Sandbox Code Playgroud)

请指导我以下问题.

谢谢

命令

env DYLD_LIBRARY_PATH =/usr/local/opt/openssl/lib/ARCHFLAGS =" - Wno-error = unused-command-line-argument-hard-error-in-future"LDFLAGS =" - L/usr/local/opt/openssl/lib"CFLAGS =" - I/usr/local/opt/openssl/include"sudo -E pip install cffi

LOG

bhushanvaiude$ env DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib/ ARCHFLAGS="-Wno-error=unused-command-line-argument-hard-error-in-future" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" sudo -E pip install cffi
Password:
Downloading/unpacking cffi
  Downloading cffi-0.8.6.tar.gz (196kB): 196kB downloaded
  Running setup.py egg_info for package cffi
    warning: unknown warning option '-Werror=unused-command-line-argument-hard-error-in-future'; did you mean '-Werror=unused-command-line-argument'? …
Run Code Online (Sandbox Code Playgroud)

python macos pip python-cffi

20
推荐指数
2
解决办法
1万
查看次数

为什么cffi比numpy快得多?

我一直在玩python中编写cffi模块,他们的速度让我想知道我是否正确使用标准python.这让我想彻底切换到C!说实话,有一些伟大的python库我永远无法在C中重新实现自己,所以这比任何事情都更加假设.

这个例子显示了python中的sum函数与numpy数组一起使用,以及与ac函数相比有多慢.是否有更快的pythonic方法来计算numpy数组的总和?

def cast_matrix(matrix, ffi):
    ap = ffi.new("double* [%d]" % (matrix.shape[0]))
    ptr = ffi.cast("double *", matrix.ctypes.data)
    for i in range(matrix.shape[0]):
        ap[i] = ptr + i*matrix.shape[1]                                                                
    return ap 

ffi = FFI()
ffi.cdef("""
double sum(double**, int, int);
""")
C = ffi.verify("""
double sum(double** matrix,int x, int y){
    int i, j; 
    double sum = 0.0;
    for (i=0; i<x; i++){
        for (j=0; j<y; j++){
            sum = sum + matrix[i][j];
        }
    }
    return(sum);
}
""")
m = np.ones(shape=(10,10))
print 'numpy says', m.sum()

m_p = cast_matrix(m, …
Run Code Online (Sandbox Code Playgroud)

c python pypy numpy python-cffi

13
推荐指数
1
解决办法
2814
查看次数

如何安装cairocffi?

如何安装cairocffipip

cairocffi是一个基于CFFI降的替代产品Pycairo https://github.com/SimonSapin/cairocffi.

我正在尝试在Ubuntu 14.04上安装它:

alvas@ubi:~$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
NAME="Ubuntu"
VERSION="14.04.2 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.2 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
Run Code Online (Sandbox Code Playgroud)

我尝试使用标准pip命令进行安装,但我得到了这个:

$ sudo pip install cairocffi
The directory '/home/alvas/.cache/pip/log' or its parent directory is not owned by the current user and the debug log has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's …
Run Code Online (Sandbox Code Playgroud)

python install pip cairo python-cffi

11
推荐指数
3
解决办法
2万
查看次数

如何在AWS Beanstalk上安装cffi包

这个问题看起来与这篇文章相同,但由于没有答案,我在这里重新问.

我有一个Django项目要部署在使用包的AWS Beanstalk上cffi.当我运行时eb deploy,错误日志如下所示:

  ......
  Installing collected packages: cffi, characteristic, idna, pyasn1, enum34, ipaddress, cryptography, cssselect, Django, django-bower, django-celery, sqlparse, django-debug-toolbar, django-devserver, django-extensions, django-filter, django-model-utils, futures, django-pipeline, djangorestframework, html5lib, ipython, ipdb, librabbitmq, lxml, Markdown, openxmllib, Pillow, psycopg2, py, pyasn1-modules, PyDocX, pyOpenSSL, pytest, python-docx, python-magic, queuelib, w3lib, zope.interface, Twisted, Scrapy, service-identity, South, uWSGI, Werkzeug
Running setup.py install for cffi
  Complete output from command /opt/python/run/venv/bin/python2.7 -c "import setuptools, tokenize;__file__='/tmp/pip-build-WWakYN/cffi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record …
Run Code Online (Sandbox Code Playgroud)

django amazon-web-services python-2.7 python-cffi

11
推荐指数
1
解决办法
3329
查看次数

在给定源代码的情况下,如何使用CFFI调用现有的C函数?

我有一个C源/头文件,是一个更大的项目的一部分.我想将其作为一个单元进行测试,与实际项目无关.虽然可以通过创建一个不同的新项目在C中执行此操作main(),但我想看看我是否可以使用Python(3)及其框架(例如,nose)来加速测试的构建,使用现有的报告框架等

我的印象是我可以用CFFI做到这一点.这是一个示例C文件:

// magic.c
// Implementation of magic.
int add(int a, int b)
{
    return a;
}
Run Code Online (Sandbox Code Playgroud)

标题:

// magic.h
// Add two numbers (where a + b is not greater than INT_MAX).
int add(int a, int b);
Run Code Online (Sandbox Code Playgroud)

这是一个只是尝试编译它的脚本,所以我可以调用一些函数:

# cffi_test.py
import cffi

INCLUDE_DIRS = ('.',)

SOURCES = ('magic.c',)

ffi = cffi.FFI()

ffi.set_source(
    '_magic_tests',
    '#include "magic.h"',
    include_dirs = INCLUDE_DIRS,
    sources = SOURCES,
    libraries = [],
    )

ffi.compile()
Run Code Online (Sandbox Code Playgroud)

最终,我计划在进行一系列单元测试之前将其作为设置的一部分.纯Python函数test_add()add()通过ffi对象调用并检查C函数的结果,该对象是在测试设置中构造的.

上面的脚本似乎有效; 它运行没有错误,它创建一个_magic_tests.c文件,一个 …

c python unit-testing python-cffi

11
推荐指数
1
解决办法
2909
查看次数

Docker 无法在 Dockerfile 中使用 python:3.9-alpine 安装 cffi

我尝试使用 docker-compose 运行下面的 Dockerfile。\n我四处搜索,但找不到如何使用 python:3.9-alpine 安装 cffi 的解决方案。

\n

我还阅读了这篇文章,其中指出 pip 21.2.4 或更高版本可能是一个可能的解决方案,但它对我来说不起作用

\n

https://www.pythonfixing.com/2021/09/fixed-why-i-getting-this-error-while.html

\n

Docker 文件

\n
FROM python:3.9-alpine\n\nENV PYTHONDONTWRITEBYTECODE 1\nENV PYTHONUNBUFFERED 1\n\nCOPY ./requirements.txt .\n\nRUN apk add --update --no-cache postgresql-client\n\nRUN apk add --update --no-cache --virtual .tmp-build-deps \\\n    gcc libc-dev linux-headers postgresql-dev\nRUN pip3 install --upgrade pip && pip3 install -r /requirements.txt\n\nRUN apk del .tmp-build-deps\n\nRUN mkdir /app\nWORKDIR /app\nCOPY . /app\n\nRUN adduser -D user\n\nUSER user\n
Run Code Online (Sandbox Code Playgroud)\n

这是requirements.txt 文件。

\n
asgiref==3.5.0\nbackports.zoneinfo==0.2.1\ncertifi==2021.10.8\ncffi==1.15.0\ncfgv==3.3.1\n...\n
Run Code Online (Sandbox Code Playgroud)\n

错误信息:

\n
process-exited-with-error\n#9 47.99   \n#9 47.99   \xc3\x97 Running setup.py install …
Run Code Online (Sandbox Code Playgroud)

python pip docker python-cffi docker-compose

11
推荐指数
2
解决办法
1万
查看次数

无法安装"Cairocffi"

我正在使用python3,我正在尝试在Ubuntu上安装" cairocffi ".为此,我已成功安装:

  1. 蟒蛇-dev的
  2. libffi-dev的
  3. CFFI

但是当我试图安装"cairocffi"时pip install cairocffi,我得到了:

      File "/usr/local/lib/python3.2/dist-packages/setuptools/dist.py", line 272
, in __init__
        _Distribution.__init__(self,attrs)
      File "/usr/lib/python3.2/distutils/dist.py", line 261, in __init__
        self.finalize_options()
      File "/usr/local/lib/python3.2/dist-packages/setuptools/dist.py", line 327
, in finalize_options
        ep.load()(self, ep.name, value)
      File "/usr/local/lib/python3.2/dist-packages/cffi/setuptools_ext.py", line
 161, in cffi_modules
        add_cffi_module(dist, cffi_module)
      File "/usr/local/lib/python3.2/dist-packages/cffi/setuptools_ext.py", line
 48, in add_cffi_module
        execfile(build_file_name, mod_vars)
      File "/usr/local/lib/python3.2/dist-packages/cffi/setuptools_ext.py", line
 24, in execfile
        exec(code, glob, glob)
      File "cairocffi/ffi_build.py", line 30, in <module>
        ffi.cdef(constants._CAIRO_HEADERS)
    AttributeError: 'module' object has no attribute '_CAIRO_HEADERS'

    ----------------------------------------
    Command "python setup.py egg_info" …
Run Code Online (Sandbox Code Playgroud)

python install pip cairo python-cffi

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

Python与Dalvik或AAF之间的本土桥梁

是否有任何项目将Python和Dalvik连接在同一地址空间中?

那是用一种语言创建的对象可以在另一种语言中注册为侦听器,反之亦然?

-

Python可以是CPython或PyPy;

Dalvik可能是完整的Android应用程序框架,也可能只是Dalvik虚拟机,或者在最坏的情况下,甚至可能是非Dalvik JVM;

Bridge可以用Python/cffi,Python/jni,本机C/C++代码甚至java编写.

据我所知,脚本环境并不能满足我的需求.

如果完全缺乏Python - Dalvik桥,我将采用全功能的基于C/C++的C/C++ - Dalvik桥作为最后的手段作为有效的答案.然后需要一个示例来实例化C/C++中的on对象,该对象可以在运行时作为有效的侦听器提交给某些Android API,包括安全性考虑因素.

python java-native-interface android dalvik python-cffi

8
推荐指数
1
解决办法
1047
查看次数