我们一直是粉丝的忠实粉丝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) 我刚刚使用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
假设我的对象布局定义为:
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扩展中的某个位置创建新实例?
Python社区发布了有用的参考资料,展示了如何分析Python代码,以及C或Cython中Python扩展的技术细节.我仍在搜索教程,但是,对于非平凡的Python程序,显示如下:
一个好的教程将为读者提供一种方法,通过完成一个完整的例子来说明如何推理优化问题.我没有成功找到这样的资源.
你知道(或有你写过)这样的教程吗?
为了澄清,我对仅涵盖以下内容的教程不感兴趣:
可能重复:
Python的任何AOP支持库?
我熟悉AspectJJava语言的扩展.
我想知道Python是否有这样的东西.
不要误解我的意思,我不是指库,而是像AspectJJava 那样的语言扩展.
我一直在尝试在我的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代码,其中函数的返回类型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
我有一个包含许多子模块的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编写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) 我可能弄乱了一些环境路径变量。
我一边学习 Django 和虚拟环境,一边修改 VS Code,并更改了 Python 安装的目录路径。在弄清楚如何指向 VS Code 的默认 Python 路径时,我删除了一些用户路径变量。
然后,伊索开始拒绝跑步。
我尝试卸载扩展、删除 ms-python、卸载 VS Code 本身、清除 Python 工作区解释器设置,然后重新启动计算机。
即使这不是我的路径变量,任何人都知道“用户”路径变量中应该包含的默认值吗?
python ×10
c ×4
cython ×3
aop ×1
distutils ×1
isort ×1
optimization ×1
pylint ×1
python-2.7 ×1
python-c-api ×1
windows ×1