标签: python-c-extension

致命错误:Python.h:没有这样的文件或目录

我正在尝试使用C扩展文件构建共享库,但首先我必须使用以下命令生成输出文件:

gcc -Wall utilsmodule.c -o Utilc
Run Code Online (Sandbox Code Playgroud)

执行命令后,我收到此错误消息:

utilsmodule.c:1:20:致命错误:Python.h:没有这样的文件或目录编译终止.

事实上我已经通过互联网尝试了所有建议的解决方案,但问题仍然存在...我也没有问题Python.h.我设法在我的机器上找到该文件......任何人在遇到同样的问题之前?

python gcc python-c-api python-c-extension

1042
推荐指数
27
解决办法
80万
查看次数

ImportError:动态模块没有定义init函数(initfizzbuzz)

我试图编译fizzbuzz.c从python导入.对于建筑fizzbuzz.c,我用过python setup.py build_ext -i.

在构建之后,我尝试导入fizzbuzz.c但发生了以下错误.我怎么解决这个问题 ?

错误

>>> import fizzbuzz
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initfizzbuzz)
Run Code Online (Sandbox Code Playgroud)

fizzbuzz.c

#include <stdio.h>

void fizzbuzz(int n){

    for (int i=1; i <= n; i++){
        if (i % 3 == 0 && i % 5 ==0){
            printf("fizzbuzz %d \n", i);
        }
        else if (i % 3 == 0){
            printf("fizz %d \n", i);
        }
        else …
Run Code Online (Sandbox Code Playgroud)

c python python-c-extension

36
推荐指数
5
解决办法
6万
查看次数

在Windows上为Python 2.7构建lxml

我正在尝试在Windows 64位机器上为Python 2.7构建lxml.我找不到Python 2.7版本的lxml egg.所以我从源头编译它.我正在按照本网站上的说明操作

http://lxml.de/build.html

在静态链接部分下.我收到了错误

C:\Documents and Settings\Administrator\Desktop\lxmlpackage\lxml-2.2.6\lxml-2.2.
6>python setup.py bdist_wininst --static
Building lxml version 2.2.6.
NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c' need
s to be available.
ERROR: 'xslt-config' is not recognized as an internal or external command,
operable program or batch file.

** make sure the development packages of libxml2 and libxslt are installed **

Using build configuration of libxslt
Building against libxml2/libxslt in one of the following directories:
  ..\libxml2-2.7.6--win32--w2k--x64\lib
  ..\libxslt-1.1.26--win32--w2k--x64--0002\lib
  ..\zlib-1.2.4--win32--w2k--x64
  ..\iconv-1.9.1--win32--w2k--x64-0001\lib
running bdist_wininst …
Run Code Online (Sandbox Code Playgroud)

python windows lxml building python-c-extension

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

如何在运行时制作python模块的副本?

我需要制作一个套接字模块的副本才能使用它,并且需要另外一个套接字模块进行猴子修补并以不同的方式使用它.

这可能吗?

我的意思是真正复制一个模块,即在运行时获得相同的结果,就好像我已经复制socketmodule.c,将initsocket()函数更改为initmy_socket(),并将其作为my_socket扩展安装.

python python-c-extension

31
推荐指数
3
解决办法
5029
查看次数

Python和OpenMP C扩展

我有一个C扩展,我想使用OpenMP.但是,当我导入我的模块时,出现导入错误:


ImportError: /home/.../_entropysplit.so: undefined symbol: GOMP_parallel_end
Run Code Online (Sandbox Code Playgroud)

我用-fopenmp和-lgomp编译了模块.这是因为我的Python安装没有用-fopenmp标志编译吗?我是否必须从源代码构建Python?还是有其他可能性吗?这是我在模块中实际使用openmp的唯一时间:


unsigned int feature_index;
#pragma omp parallel for
for (feature_index = 0; feature_index < num_features; feature_index++) {
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想坚持使用openmp,因为它非常简单,并且在这种情况下并行化非常适合它.

编辑:我咬了一口气,用OpenMP支持重新编译了Python.我的模块现在完美运行,但这不是一个很好的解决方案.如果需要完全重新编译Python,我无法真正分发它.所以有人知道这方面的一些方法吗?或许ctypes会起作用吗?

解决了!这是一个简单的链接问题.(我为此重建了Python?!)在编译模块期间,OpenMP没有正确链接.因此,IS可以加载使用OpenMP的一个C Python扩展.

python parallel-processing openmp python-c-extension

29
推荐指数
2
解决办法
6004
查看次数

带有__init __.pyx的Cython包:可能吗?

是否可以使用__init__.pyx(编译__init__.so)创建Python 2.7包?如果是这样的话?我没有运气好运.

这是我尝试过的:

  • setup.py:

    #!/usr/bin/env python
    
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
    
    foo = Extension(name='foo.__init__', sources=['foo/__init__.pyx'])
    bar = Extension(name='foo.bar', sources=['foo/bar.pyx'])
    
    setup(name='foo',
          packages = ['foo'],
          cmdclass={'build_ext':build_ext},
          ext_modules = [foo, bar])
    
    Run Code Online (Sandbox Code Playgroud)
  • foo/__init__.pyx:

    import foo.bar
    
    cpdef hello_world():
        print "hello world"
        foo.bar.blah()
    
    Run Code Online (Sandbox Code Playgroud)
  • foo/bar.pyx:

    cpdef blah():
        print "blah"
    
    Run Code Online (Sandbox Code Playgroud)

以上具有以下行为:

$ python -c 'import foo; foo.hello_world()'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named foo
Run Code Online (Sandbox Code Playgroud)

我看到 …

python cython python-import python-c-extension python-2.7

26
推荐指数
1
解决办法
3444
查看次数

Python C扩展:使用扩展名PYD或DLL?

我有一个用C编写的Python扩展,我想知道我是否应该在Windows下使用文件扩展名DLL或PYD.(我会在Linux中使用什么?)

有没有差异(除了文件名)?

我发现了一篇非官方的文章.这是pyc的秘密吗?为什么我找不到关于这个主题的官方文章?

python pyd python-c-extension

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

将布尔值传递给Python C扩展的"正确"方法是什么?

这是python文档(http://docs.python.org/extending/extending.html)中的一个简单示例:

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return Py_BuildValue("i", sts);
}
Run Code Online (Sandbox Code Playgroud)

如果我想将另一个布尔参数传递给函数 - 这是什么"正确"的方法呢?

似乎没有传递给PyArg_ParseTuple()的bool选项.所以我想到了以下几点:

  1. 读取一个整数并只使用该值(因为bool是int的子类)
  2. 在整数上调用PyBool_FromLong()
  3. 读取和对象并调用PyBool_Check()来验证它是一个bool
  4. 也许有一种方法可以获得任何类型的变量并获得其真值(即空数组将是假数据等),这是python函数通常所做的.

这些中哪一个更好?其他选择?

python python-c-api python-c-extension

23
推荐指数
3
解决办法
9521
查看次数

Python 3中的PyEval_InitThreads:如何/何时调用它?(传奇继续令人作呕)

基本上似乎存在大量混淆/模糊性,而不PyEval_InitThreads()应该在什么时候被调用,以及需要哪些API调用.遗憾的是,官方Python文档非常模糊.关于这个主题的stackoverflow已经有很多问题了,事实上,我个人已经问了一个与这个问题几乎完全相同的问题,所以如果这个问题以复制方式结束,我不会特别感到惊讶; 但是考虑到这个问题似乎没有明确的答案.(可悲的是,我没有Guido Van Rossum的快速拨号.)

首先,让我们在这里定义问题的范围:我想做什么? 嗯...我想在C中编写一个Python扩展模块,它将:

  1. pthread在C中使用API的Spawn工作线程
  2. 从这些C线程中调用Python回调

好的,让我们从Python文档开始吧.在Python的3.2文档说:

void PyEval_InitThreads()

初始化并获取全局解释器锁.它应该在创建第二个线程或参与任何其他线程操作(如PyEval_ReleaseThread(tstate))之前在主线程中调用.在调用PyEval_SaveThread()或PyEval_RestoreThread()之前不需要它.

所以我的理解是:

  1. 产生线程的任何C扩展模块必须PyEval_InitThreads()在生成任何其他线程之前从主线程调用
  2. 调用PyEval_InitThreads锁定GIL

所以常识告诉我们,任何创建线程的C扩展模块都必须调用PyEval_InitThreads(),然后释放Global Interpreter Lock.好吧,看起来很简单.所以初步,所有的需要将以下代码:

PyEval_InitThreads(); /* initialize threading and acquire GIL */
PyEval_ReleaseLock(); /* Release GIL */
Run Code Online (Sandbox Code Playgroud)

看起来很简单......但不幸的是,Python 3.2文档PyEval_ReleaseLock已经弃用了.相反,我们应该使用PyEval_SaveThread以释放GIL:

PyThreadState*PyEval_SaveThread()

释放全局解释器锁(如果已创建并启用了线程支持)并将线程状态重置为NULL,则返回先前的线程状态(不是NULL).如果已创建锁,则当前线程必须已获取它.

呃......好吧,我想C扩展模块需要说:

PyEval_InitThreads();
PyThreadState* st = PyEval_SaveThread();
Run Code Online (Sandbox Code Playgroud)


实际上,这正是这个stackoverflow回答所说的.除非我在实践中尝试这样做,否则当我导入扩展模块时,Python解释器会立即出现错误.尼斯. …

python python-c-api python-c-extension python-3.x python-3.2

20
推荐指数
3
解决办法
6203
查看次数

Python的C扩展中的Docstrings?

在为Python创建C扩展时,是否有可能以某种方式将扩展为文档字符串的注释写入扩展的用户?

python cpython python-c-extension

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