Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用C扩展,而不将其作为模块安装_Python_C_Python 2.7_Python C Api_Python Extensions - Fatal编程技术网

在python中使用C扩展,而不将其作为模块安装

在python中使用C扩展,而不将其作为模块安装,python,c,python-2.7,python-c-api,python-extensions,Python,C,Python 2.7,Python C Api,Python Extensions,我正在为python编写C扩展。我只是暂时尝试一下,我已经写了一个hello world扩展,看起来像这样: #include <Python2.7/Python.h> static PyObject* helloworld(PyObject* self) { return Py_BuildValue("s", "Hello, Python extensions!!"); } static char helloworld_docs[] = "helloworld( ):

我正在为python编写C扩展。我只是暂时尝试一下,我已经写了一个hello world扩展,看起来像这样:

#include <Python2.7/Python.h>

static PyObject* helloworld(PyObject* self)
{
    return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloworld_docs[] = "helloworld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
    {"helloworld", (PyCFunction)helloworld, METH_NOARGS, helloworld_docs},
    {NULL,NULL,0,NULL}
};

void inithelloworld(void)
{
    Py_InitModule3("helloworld", helloworld_funcs,"Extension module example!");
}
我想要的是:


我希望将C文件用作python扩展模块,而不安装它,也就是说,我希望将它用作项目中的另一个python文件,而不是在python模块使用其功能之前需要安装的文件。有什么方法可以做到这一点吗?

您可以创建“自己的解释器”,方法是不扩展python,而是将其嵌入到应用程序中。这样,运行您的程序的用户将始终可以使用您的对象。在某些情况下,这是一件非常常见的事情,例如查看Blender项目,其中已经包含了所有的
bpy
bmesh
bge
模块

缺点是,您的用户不能直接使用
python
命令,他们必须使用您的
hello\u world\u python
。(当然,您也可以将扩展作为一个模块提供。)这也意味着,您必须为您想要支持的所有平台编译和分发您的应用程序——如果您想将其作为二进制文件分发,则可以让您的用户生活得更轻松

有关将python嵌入程序的更多信息,请阅读文档的相应部分:

个人建议:尽可能使用Python 3.5,并停止支持旧的2.x版本。有关更多信息,请阅读本文:


您只需编译扩展而无需安装(通常类似于
python setup.py build
)。然后,您必须确保解释器能够找到已编译的模块(例如,将其复制到导入它的脚本旁边,或者设置
PYTHONPATH
)。

您能否详细说明您想要实现的目标?扩展模块只是Python可以加载的共享库。“安装”只是指将其复制到Python查找其模块的位置。您的意思是希望从非系统范围的位置运行模块吗?或者您不想避免依赖于
setup.py
,而是手动安装(复制)扩展模块?它需要存在于某个平台上,所以您能否澄清当您声明不想安装它时的意思?我想在我的项目中将其用作另一个python文件,而不是在我的项目中的其他python模块使用它之前需要安装的文件functionality@TonySuffolk66我可以这样做吗?我的python脚本将首先检查模块是否已安装,如果未安装,则从python脚本本身安装C模块。“有什么方法可以做到这一点吗?”ironstein——理论上你可以做到——但你为什么要这么做?通常会随应用程序安装所有依赖项。我可能弄错了,但我不知道有哪个主要应用程序会按需安装依赖项(我不是说可选插件)。我不认为这是一个解决方案,因为你必须确保python会找到你的模块,也就是说,你必须在最后安装它,或者至少扩展你的
路径
@hmn我使用python setup.py build构建了这个扩展,它在两个不同的文件夹中为我提供了mac osx 10.6和mac osx 10.10的共享库(.so文件)。如果我想在windows上使用已编译的扩展,我会怎么做?而且一旦我建立了它,我该如何使用共享库?@ironstein你不能在Windows上使用为Mac编译的模块。必须为目标系统和应该使用它们的Python版本编译C扩展模块。为什么
-1
?我可以做一些类似的事情吗?我的Python脚本将首先检查模块是否已安装,如果未安装,则从Python脚本本身安装C模块。有什么方法可以做到这一点吗?@ironstein您可以
尝试导入模块,并在
导入时警告用户,以便用户必须安装模块。您甚至可以在给定的错误消息中放置进一步的说明(例如从何处下载)。(另一个可能的解决方案是——这也是很常见的——实现模块的纯python版本作为备用选项,因此即使您的C扩展不可用,但您的纯python版本可用,那么您的程序也将使用它。Ofc如果缺少yoo,您必须按照我在前面的评论中提到的操作)在您提到的“尝试/例外”方法中,如果我在“尝试”部分遇到了问题,是否可以在“例外”部分以某种方式安装模块?谢谢您的帮助。
python setup.py install