2009-12-26 98 views
1

我试图通过我编写的几个C函数来扩展Python解释器。从阅读文档,为了公开这些功能,用户必须导入包含功能的模块。扩展Python:预加载我的C模块

是否有可能通过C API来加载预加载或预导入模块,使用户不必键入import <mymodule>?或者更好,from <mymodule> import <function>?我可以在Py_Initialize()后面执行PyRun_SimpleString(“from mymodule import myfunction”);我可以在Py_Initialize()之后执行PyRun_SimpleString(“from mymodule import myfunction”)。 - 我只是想知道是否有另一种方式来做到这一点..?

编辑2:换句话说,我有一个用C语言编写的嵌入Python解释器的应用程序。该应用程序提供了一些我想要公开给用户的功能,以便他们可以为应用程序编写简单的Python脚本。我所要做的就是取消编写from mymodule import myfunction1, myfunction2的需求,因为它是非常专业化的应用程序,并且脚本无论如何都不会在没有应用程序的情况下工作,所以一直要求import ...毫无意义。

+0

为什么你需要这样做?为什么? – shylent 2009-12-26 14:47:29

+0

“,以便用户不必键入导入” – EcirH 2009-12-26 14:51:51

+0

根据您的编辑,它是一个脚本,因此您可以在脚本中添加'from mymodule import ...'。没有人需要再输入那个。 – 2009-12-26 18:59:45

回答

0

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

import <mymodule>不只是加载模块,它也是使该模块中(主|电流)可见的命名空间。能够做到这一点,不用黑客攻击实际的Python解释器,会非常强烈地反对“显式优于隐式”。

+0

当前命名空间可能是字典,对吗?所以它可能会以某种方式找到该dict和AddItem()我的功能......? – EcirH 2009-12-26 14:35:53

+0

@EricH - 即使它有可能以某种诡计的方式出现,也不要这样做。这在Python中不是惯用的,不是用户期望的,通常也是一种不好的做法。 – 2009-12-26 15:03:21

3

即使你在Python中实现一个模块,用户将不得不import它。这是Python的工作方式,它实际上是一件好事 - 这是Python的伟大的长处之一 - 命名空间/模块系统是强大的,易于使用和易于理解。

学术练习而已,你当然可以添加新的功能,Python本身,通过创建一个自定义的解释。你甚至可以用这种方式创建新的关键字。但是出于任何实际目的,这不被推荐。

2

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

我能想到的唯一情况是,如果你和你的小组正在使用python进行数据分析,定制命令为您的特定问题,大多数用户比程序员更多的科学家/统计学家。但即使在这种情况下,我也会建议使用IPython,创建一个IPython profile,然后为用户创建一个别名/脚本来运行。它更干净,不同的名称警告他们不使用默认的Python环境。

1

如果你真的想这样做,设置您PYTHONSTARTUP环境变量指向的文件。在shkshbash等,你可以这样做:

PYTHONSTARTUP=$HOME/.pystartup 
export PYTHONSTARTUP 

然后,你就可以把语句和代码在你$PYTHONSTARTUP文件:

echo "import blah" >>$PYTHONSTARTUP 

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

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链接这篇文章中提到的项目基本上都是y执行:

from OpenGL.GL import * 
from OpenGL.GLU import * 
from OpenGL.GLUT import * 

Python初始化后。