标签: python-extensions

pylint 1.4报告所有C扩展上的E1101(无成员)

我们一直是粉丝的忠实粉丝pylint.它的静态分析已成为我们所有python项目的关键部分,并且节省了大量时间来追逐晦涩的错误.但是从1.3 - > 1.4升级后,几乎所有编译的c扩展都会导致E1101(无成员)错误.

之前通过pylint1.3 运行完全清洁的项目现在抱怨几乎每个使用E1101的C扩展成员.我们被迫禁用E1101错误,但这实际上减损了它的用处pylint.

例如,这完全有效地使用了lxml

r"""valid.py: demonstrate pylint 1.4 error"""
from lxml import etree
print etree.Element('mydoc')
Run Code Online (Sandbox Code Playgroud)

运行此过程pylint,它会报告:

$ pylint -rn valid.py
No config file found, using default configuration
************* Module valid
E:  3, 6: Module 'lxml.etree' has no 'Element' member (no-member)
Run Code Online (Sandbox Code Playgroud)

但它完全有效:

$ python valid.py
<Element mydoc at 7fddf67b1ba8>
Run Code Online (Sandbox Code Playgroud)

这里真的很奇怪.一小部分C扩展似乎可以正常工作pylint,例如:

r"""valid2.py: this one works fine"""
import sqlite3
print sqlite3.version

$ pylint -rn valid2.py
No config file …
Run Code Online (Sandbox Code Playgroud)

python pylint python-extensions

47
推荐指数
3
解决办法
9851
查看次数

Cython编译C扩展:ImportError:动态模块没有定义init函数

我刚刚使用Cython将我的C库的一部分编译为扩展,作为"概念证明".我设法破解了代码(const纠正问题等),最终得到了一个扩展.

但是,当我尝试导入新创建的扩展时,我收到以下错误:

ImportError: dynamic module does not define init function 
Run Code Online (Sandbox Code Playgroud)

我做错了什么,如何解决这个问题?

我在Ubuntu 10.0.4上使用Cythn 0.11.2和Python 2.6.5

python cython python-extensions

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

使用Python的C API创建对象

假设我的对象布局定义为:

typedef struct {
    PyObject_HEAD
    // Other stuff...
} pyfoo;
Run Code Online (Sandbox Code Playgroud)

...和我的类型定义:

static PyTypeObject pyfoo_T = {
    PyObject_HEAD_INIT(NULL)
    // ...

    pyfoo_new,
};
Run Code Online (Sandbox Code Playgroud)

如何pyfoo在C扩展中的某个位置创建新实例?

c python python-embedding python-c-api python-extensions

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

有关使用C扩展或Cython优化非平凡Python应用程序的教程

Python社区发布了有用的参考资料,展示了如何分析Python代码,以及C或Cython中Python扩展的技术细节.我仍在搜索教程,但是,对于非平凡的Python程序,显示如下:

  1. 如何通过转换为C扩展来识别将从优化中受益的热点
  2. 同样重要的是,如何识别不会从转换为C扩展中受益的热点
  3. 最后,如何使用Python C-API或(甚至可能更好)使用Cython进行从Python到C的适当转换.

一个好的教程将为读者提供一种方法,通过完成一个完整的例子来说明如何推理优化问题.我没有成功找到这样的资源.

你知道(或有你写过)这样的教程吗?

为了澄清,我对涵盖以下内容的教程不感兴趣:

  • 使用(c)Profile来分析Python代码以测量运行时间
  • 使用工具检查配置文件(我推荐RunSnakeRun)
  • 通过选择更合适的算法或Python构造进行优化(例如,用于成员资格测试而不是列表的集合); 本教程应该假设算法和Python代码已经是最优的,并且我们处于C扩展是下一个逻辑步骤的位置
  • 重新编写关于编写C扩展Python文档,这已经很好地作为参考,但作为显示何时以及如何从Python移动到C的资源无用.

c python optimization cython python-extensions

25
推荐指数
2
解决办法
1852
查看次数

Python中的面向方面编程(AOP)

可能重复:
Python的任何AOP支持库?

我熟悉AspectJJava语言的扩展.

我想知道Python是否有这样的东西.

不要误解我的意思,我不是指库,而是像AspectJJava 那样的语言扩展.

python aop python-extensions

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

在Windows x64中运行Cython - 致命错误C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录

我一直在尝试在我的Window 7系统上安装Cython for Python 2.7.特别是,我更喜欢64位的所有内容.(如果你想知道,我需要Cython,因为Cython是我需要另一个软件包进行专门的数值分析所需的组件之一.而x64可能是存储大型数据集的一个优势.)

所以我从官方网站下载了x64 Python 2.7.来自Christoph Gohlke的Cython.当然,Python 2.7的amd64版本.在我安装之前,我将Python 2.7添加到注册表中,其中.reg包含Joe DF的答案中的文件.之后,我从这里安装了Visual C++编译器(我认为它不起作用)和这里(但是应该这样).在这一点上,我有我的C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin目录中所有的vcvars32.bat,vcvars64.bat,vcvars86_amd64.bat,vcvarsx86_ia64.bat.我跑了vcvars64.bat,没有错误信息.

随后,我按照此页面创建了一个"hello world"测试文件.

然后,我收到了这个错误.

...\Tests>python setup.py build_ext --inplace
running build_ext
building 'hello' extension
error: Unable to find vcvarsall.bat
Run Code Online (Sandbox Code Playgroud)

所以我心想:嗯,Cython找不到那个文件,因为它不存在.(我搜索我的整个它的硬盘.)所以我复制vcvars64.bat...\VC\bin\VC,改变了名称vcvarsall.bat.现在vcvarsall错误消失了.而且......自然会出现一个新的错误.

...\Tests>python setup.py build_ext --inplace
running build_ext
building 'hello' extension
C:\Program Files (x86)\Microsoft …
Run Code Online (Sandbox Code Playgroud)

python windows cython python-2.7 python-extensions

25
推荐指数
3
解决办法
4万
查看次数

什么是Python中的PyObject?

精简版

我最近遇到了一些Python代码,其中函数的返回类型PyObject文档中指定.什么是PyObject

详细版本

我不是C/C++程序员,但是当我遇到PyObject上面链接的文档时,Google告诉我这PyObject是一个使用Python/C API定义的Python对象.具体来说,API文档定义PyObject如下:

所有对象类型都是此类型的扩展.这是一种类型,其中包含Python将对象指针视为对象所需的信息.在正常的"发布"版本中,它仅包含对象的引用计数和指向相应类型对象的指针.它对应于PyObject_HEAD宏扩展定义的字段.

坦率地说,我并不完全理解这一点,或者它是否回答了我的基本问题,但它并没有让我觉得将PyObject一个对象视为一个完整的Python对象显然是错误的.另一方面,也许从技术上来说,PyObject必须使用Python/C API将该类型创建为标准Python的扩展.例如,是一个整数a PyObject

可能相关的链接

http://docs.scipy.org/doc/numpy/reference/c-api.types-and-structures.html

c python python-extensions

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

如何构建Python C扩展,以便我可以从模块中导入它

我有一个包含许多子模块的Python项目,我用distutils打包.我想在C中构建一些Python扩展以存在于其中一些子模块中,但我不明白如何使Python扩展存在于子模块中.以下是我正在寻找的最简单的例子:

这是我的Python扩展c_extension.c:

#include <Python.h>

static PyObject *
get_answer(PyObject *self, PyObject *args)
{
    return Py_BuildValue("i", 42);
}

static PyMethodDef Methods[] = {
    {"get_answer",  get_answer, METH_VARARGS, "The meaning of life."},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initc_extension(void) {
  (void) Py_InitModule("c_extension", Methods);
}
Run Code Online (Sandbox Code Playgroud)

以下setup.py是有效的:

from distutils.core import setup
from distutils.extension import Extension

setup(name='c_extension_demo',
      ext_modules = [Extension('c_extension', sources = ['c_extension.c'])])
Run Code Online (Sandbox Code Playgroud)

在virtualenv中安装后我可以这样做:

>>> import c_extension
>>> c_extension.get_answer()
42
Run Code Online (Sandbox Code Playgroud)

但是,我想c_extension生活在一个子模块中foo.bar.我需要在此管道中进行哪些更改才能使Python shell中的行为如下所示:

>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
Run Code Online (Sandbox Code Playgroud)

python distutils python-extensions

19
推荐指数
1
解决办法
6236
查看次数

编译器找不到Py_InitModule()..它是否已被弃用,如果是这样,我应该使用什么?

我正在尝试为python编写C扩展.使用代码(如下)我得到编译器警告:

implicit declaration of function ‘Py_InitModule’
Run Code Online (Sandbox Code Playgroud)

它在运行时失败并出现此错误:

undefined symbol: Py_InitModule
Run Code Online (Sandbox Code Playgroud)

我花了几个小时寻找一个没有快乐的解决方案.我尝试过多次语法修改,我甚至发现一篇帖子暗示该方法已被弃用.但是我发现没有替代品.

这是代码:

#include <Python.h>

//a func to calc fib numbers
int cFib(int n)
{
    if (n<2) return n;
    return cFib(n-1) + cFib(n-2);
}


static PyObject* fib(PyObject* self,PyObject* args)
{
    int n;
    if (!PyArg_ParseTuple(args,"i",&n)) 
        return NULL;    
    return Py_BuildValue("i",cFib(n));
}

static PyMethodDef module_methods[] = {
    {"fib",(PyCFunction) fib, METH_VARARGS,"calculates the fibonachi number"},
    {NULL,NULL,0,NULL}
};

PyMODINIT_FUNC initcModPyDem(void)
{
    Py_InitModule("cModPyDem",module_methods,"a module");
}
Run Code Online (Sandbox Code Playgroud)

如果它有帮助,这是我的setup.py:

from distutils.core import setup, Extension

module = Extension('cModPyDem', sources=['cModPyDem.c'])
setup(name = 'packagename', …
Run Code Online (Sandbox Code Playgroud)

c python python-extensions

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

VS Code:“isort 服务器在过去 3 分钟内崩溃了 5 次......”

我可能弄乱了一些环境路径变量。

我一边学习 Django 和虚拟环境,一边修改 VS Code,并更改了 Python 安装的目录路径。在弄清楚如何指向 VS Code 的默认 Python 路径时,我删除了一些用户路径变量。

然后,伊索开始拒绝跑步。

我尝试卸载扩展、删除 ms-python、卸载 VS Code 本身、清除 Python 工作区解释器设置,然后重新启动计算机。

即使这不是我的路径变量,任何人都知道“用户”路径变量中应该包含的默认值吗?

python python-extensions visual-studio-code isort

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