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

1 投票
5 回答
730 浏览
提问于 2025-04-15 17:22

我正在尝试通过我写的一些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 ...是没有意义的。

5 个回答

1

如果你真的想这样做,可以把你的 PYTHONSTARTUP 环境变量设置为指向一个文件。在 shkshbash 等终端中,你可以这样操作:

PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP

然后,你可以在你的 $PYTHONSTARTUP 文件里写一些语句和代码:

echo "import blah" >>$PYTHONSTARTUP

这样就可以了。不过,这个方法只适用于交互式会话。

3

即使你在Python中实现了一个模块,用户还是需要用import来引入它。这就是Python的工作方式,实际上这是件好事——这是Python的一个大优点:它的命名空间和模块系统非常强大,使用起来简单明了。

如果只是为了学术练习,你当然可以通过创建一个自定义的解释器,把你的新功能直接添加到Python里。这样你甚至可以创建新的关键字。不过对于实际应用来说,这并不推荐。

3

一般来说,不可以。不过,如果你的用户只是在交互式会话中使用你的模块,并且你可以设置他们的环境变量,那么你可以把 PYTHONSTARTUP 环境变量 设置为一个脚本,这样在开始交互式会话时就会运行这个脚本。

我能想到的唯一情况是,如果你和你的团队在做数据分析,使用一些针对特定问题的自定义命令,而大多数用户更像是科学家或统计学家,而不是程序员。但即便如此,我还是建议使用 IPython,创建一个 IPython 配置文件,然后为用户创建一个别名或脚本来运行。这样更简洁,而且不同的名称可以提醒他们,他们并不是在使用默认的 Python 环境。

撰写回答