我正在使用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)
但是,我想改进这段代码:
ffi.buffer非常方便快速转换为C数组的内容到Numpy数组.是否有一种等效方法可以快速将numpy数组转换为C数组而无需复制单个元素?float_in[0:16] = arr_in[0:16]是一种访问数据的便捷方式.相反,arr_out[0:16] = float_out[0:16] …我想创建python包,.so在Linux上使用cffi模块嵌入和使用外部库().
有没有标准的方法将.so文件包含到python包中?
该软件包仅在内部使用,不会发布到pypi.
我认为Wheel包是最好的选择 - 他们会创建特定于平台的包,所有文件都可以复制,因此不需要在目标环境中构建任何东西.
我正在安装用于加密和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
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中编写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) 如何安装cairocffi过pip?
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) 这个问题看起来与这篇文章相同,但由于没有答案,我在这里重新问.
我有一个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) 我有一个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文件,一个 …
我尝试使用 docker-compose 运行下面的 Dockerfile。\n我四处搜索,但找不到如何使用 python:3.9-alpine 安装 cffi 的解决方案。
\n我还阅读了这篇文章,其中指出 pip 21.2.4 或更高版本可能是一个可能的解决方案,但它对我来说不起作用
\nhttps://www.pythonfixing.com/2021/09/fixed-why-i-getting-this-error-while.html
\nDocker 文件
\nFROM 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\nRun Code Online (Sandbox Code Playgroud)\n这是requirements.txt 文件。
\nasgiref==3.5.0\nbackports.zoneinfo==0.2.1\ncertifi==2021.10.8\ncffi==1.15.0\ncfgv==3.3.1\n...\nRun Code Online (Sandbox Code Playgroud)\n错误信息:
\nprocess-exited-with-error\n#9 47.99 \n#9 47.99 \xc3\x97 Running setup.py install …Run Code Online (Sandbox Code Playgroud) 我正在使用python3,我正在尝试在Ubuntu上安装" cairocffi ".为此,我已成功安装:
但是当我试图安装"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和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-cffi ×10
python ×9
pip ×4
c ×2
cairo ×2
install ×2
numpy ×2
android ×1
arrays ×1
dalvik ×1
django ×1
docker ×1
macos ×1
pypy ×1
python-2.7 ×1
python-wheel ×1
unit-testing ×1