我正在尝试使用C扩展文件构建共享库,但首先我必须使用以下命令生成输出文件:
gcc -Wall utilsmodule.c -o Utilc
Run Code Online (Sandbox Code Playgroud)
执行命令后,我收到此错误消息:
utilsmodule.c:1:20:致命错误:Python.h:没有这样的文件或目录编译终止.
事实上我已经通过互联网尝试了所有建议的解决方案,但问题仍然存在...我也没有问题Python.h.我设法在我的机器上找到该文件......任何人在遇到同样的问题之前?
我试图编译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)
#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) 我正在尝试在Windows 64位机器上为Python 2.7构建lxml.我找不到Python 2.7版本的lxml egg.所以我从源头编译它.我正在按照本网站上的说明操作
在静态链接部分下.我收到了错误
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) 我需要制作一个套接字模块的副本才能使用它,并且需要另外一个套接字模块进行猴子修补并以不同的方式使用它.
这可能吗?
我的意思是真正复制一个模块,即在运行时获得相同的结果,就好像我已经复制socketmodule.c,将initsocket()函数更改为initmy_socket(),并将其作为my_socket扩展安装.
我有一个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扩展.
是否可以使用__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)
我看到 …
我有一个用C编写的Python扩展,我想知道我是否应该在Windows下使用文件扩展名DLL或PYD.(我会在Linux中使用什么?)
有没有差异(除了文件名)?
我发现了一篇非官方的文章.这是pyc的秘密吗?为什么我找不到关于这个主题的官方文章?
这是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选项.所以我想到了以下几点:
这些中哪一个更好?其他选择?
基本上似乎存在大量混淆/模糊性,而不PyEval_InitThreads()应该在什么时候被调用,以及需要哪些API调用.遗憾的是,官方Python文档非常模糊.关于这个主题的stackoverflow已经有很多问题了,事实上,我个人已经问了一个与这个问题几乎完全相同的问题,所以如果这个问题以复制方式结束,我不会特别感到惊讶; 但是考虑到这个问题似乎没有明确的答案.(可悲的是,我没有Guido Van Rossum的快速拨号.)
首先,让我们在这里定义问题的范围:我想做什么? 嗯...我想在C中编写一个Python扩展模块,它将:
pthread在C中使用API的Spawn工作线程好的,让我们从Python文档开始吧.在Python的3.2文档说:
void PyEval_InitThreads()
初始化并获取全局解释器锁.它应该在创建第二个线程或参与任何其他线程操作(如PyEval_ReleaseThread(tstate))之前在主线程中调用.在调用PyEval_SaveThread()或PyEval_RestoreThread()之前不需要它.
所以我的理解是:
PyEval_InitThreads()在生成任何其他线程之前从主线程调用
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
在为Python创建C扩展时,是否有可能以某种方式将扩展为文档字符串的注释写入扩展的用户?
python ×10
python-c-api ×3
building ×1
c ×1
cpython ×1
cython ×1
gcc ×1
lxml ×1
openmp ×1
pyd ×1
python-2.7 ×1
python-3.2 ×1
python-3.x ×1
windows ×1