我正在尝试通过我编写的一些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 ...
没有意义
答案 0 :(得分:3)
即使您在Python中实现模块,用户也必须import
。这就是Python的工作方式,它实际上是一件好事 - 它是Python的优点之一 - 命名空间/模块系统功能强大,易于使用且易于理解。
仅限学术练习,您当然可以通过创建自定义解释器将新功能添加到Python本身。您甚至可以通过这种方式创建新关键字。但出于任何实际目的,不建议这样做。
答案 1 :(得分:2)
一般来说,没有。但是,如果您的用户只是在交互式会话中使用您的模块,并且您可以设置其环境变量,则可以将PYTHONSTARTUP environmental variable设置为在启动交互式会话时运行的脚本。
我能想到的唯一情况是,如果您和您的团队使用python进行数据分析,为您的特定问题提供自定义命令,并且大多数用户比程序员更多的是科学家/统计人员。但即使在这种情况下,我建议使用IPython,创建IPython profile,然后为用户运行创建别名/脚本。它更干净,不同的名称警告他们他们没有使用默认的Python环境。
答案 2 :(得分:1)
如果您确实想这样做,请将PYTHONSTARTUP
环境变量设置为指向文件。在sh
,ksh
,bash
等,您可以执行以下操作:
PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP
然后,您可以在$PYTHONSTARTUP
文件中添加语句和代码:
echo "import blah" >>$PYTHONSTARTUP
应该这样做。它仅适用于交互式会话。
答案 3 :(得分:0)
不。你可以将它添加到Python解释器本身,但这意味着要创建一个自定义Python版本,我想这不是你想要的。
import <mymodule>
不仅用于加载模块,还用于在(main | current)命名空间中显示此模块。能够做到这一点,没有黑客攻击实际的Python解释器,将非常强烈地反对“明确比隐含更好”。
答案 4 :(得分:0)
查看此博客文章,了解如何在嵌入式python中预先导入模块。
例如,在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初始化之后。