1

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

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

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

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

4

5 回答 5

3

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

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

于 2009-12-26T15:25:31.370 回答
3

即使您在 Python 中实现了一个模块,用户也必须这样import做。这就是 Python 的工作方式,它实际上是一件好事——它是 Python 的一大优点——命名空间/模块系统健壮、易于使用且易于理解。

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

于 2009-12-26T14:34:34.373 回答
1

如果您真的想这样做,请将您的PYTHONSTARTUP环境变量设置为指向一个文件。在sh,kshbash中,您可以执行以下操作:

PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP

然后,您可以将语句和代码放入$PYTHONSTARTUP文件中:

echo "import blah" >>$PYTHONSTARTUP

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

于 2009-12-26T15:26:01.930 回答
0

查看这篇关于如何在嵌入式 python 中预导入模块的博客文章。

在 C/C++ 中嵌入 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);

这里还有一个链接到文章中提到的项目的相关代码,它基本上执行:

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

在 Python 初始化之后。

于 2012-08-19T08:59:49.080 回答
0

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

import <mymodule>不仅用于加载模块,还用于使该模块在 (main|current) 命名空间中可见。能够做到这一点,而无需破解实际的 Python 解释器,将非常强烈地违反“显式优于隐式”。

于 2009-12-26T14:30:34.523 回答