扩展Python:预加载我的C模块

时间:2009-12-26 14:05:57

标签: python c import python-c-api python-embedding

我正在尝试通过我编写的一些C函数来扩展Python解释器。从阅读文档到公开这些功能,用户必须导入包含功能的模块。

是否可以通过C API加载预加载或预导入模块,以便用户不必键入import <mymodule>?甚至更好,from <mymodule> import <function>

编辑:我可以在Py_Initialize()之后做PyRun_SimpleString(“来自mymodule import myfunction”); - 我只是想知道是否有另一种方法可以做到这一点......?

编辑2:换句话说,我有一个用C编写的应用程序,它嵌入了Python解释器。该应用程序提供了一些我想向用户公开的功能,以便他们可以为应用程序编写简单的Python脚本。我想要的只是删除编写from mymodule import myfunction1, myfunction2的需要,因为它是非常专业的应用程序,并且无论如何没有应用程序脚本也无法工作,所以始终要求import ...没有意义

5 个答案:

答案 0 :(得分:3)

即使您在Python中实现模块,用户也必须import。这就是Python的工作方式,它实际上是一件好事 - 它是Python的优点之一 - 命名空间/模块系统功能强大,易于使用且易于理解。

仅限学术练习,您当然可以通过创建自定义解释器将新功能添加到Python本身。您甚至可以通过这种方式创建新关键字。但出于任何实际目的,不建议这样做。

答案 1 :(得分:2)

一般来说,没有。但是,如果您的用户只是在交互式会话中使用您的模块,并且您可以设置其环境变量,则可以将PYTHONSTARTUP environmental variable设置为在启动交互式会话时运行的脚本。

我能想到的唯一情况是,如果您和您的团队使用python进行数据分析,为您的特定问题提供自定义命令,并且大多数用户比程序员更多的是科学家/统计人员。但即使在这种情况下,我建议使用IPython,创建IPython profile,然后为用户运行创建别名/脚本。它更干净,不同的名称警告他们他们没有使用默认的Python环境。

答案 2 :(得分:1)

如果您确实想这样做,请将PYTHONSTARTUP环境变量设置为指向文件。在shkshbash等,您可以执行以下操作:

PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP

然后,您可以在$PYTHONSTARTUP文件中添加语句和代码:

echo "import blah" >>$PYTHONSTARTUP

应该这样做。它仅适用于交互式会话。

答案 3 :(得分:0)

不。你可以将它添加到Python解释器本身,但这意味着要创建一个自定义Python版本,我想这不是你想要的。

import <mymodule>不仅用于加载模块,还用于在(main | current)命名空间中显示此模块。能够做到这一点,没有黑客攻击实际的Python解释器,将非常强烈地反对“明确比隐含更好”。

答案 4 :(得分:0)

查看此博客文章,了解如何在嵌入式python中预先导入模块。

  

Embed Python and Import Modules in C/C++

例如,在Python中模拟以下语句:

from hashlib import md5, sha1

我们在C:

PyObject * subModules = PyList_New(0);
PyList_Append(subModules, PyString_FromString("md5"));
PyList_Append(subModules, PyString_FromString("sha1"));
PyObject * hashlibImports = PyImport_ImportModuleEx("hashlib", NULL, NULL, subModules);
PyObject * md5Module = PyObject_GetAttr(hashlibImports, PyString_FromString("md5"));
PyObject * sha1Module = PyObject_GetAttr(hashlibImports, PyString_FromString("sha1"));
PyObject * mainModule = PyImport_AddModule("__main__");
PyModule_AddObject(mainModule, "md5", md5Module);
PyModule_AddObject(mainModule, "sha1", sha1Module);

此处还有一篇指向relevant code的链接,该链接来自文章中提到的基本上执行的项目:

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
在Python初始化之后