从编译输出动态导入运行时指定的模块

2024-05-29 03:34:06 发布

您现在位置:Python中文网/ 问答频道 /正文

概述

我在一个项目中创建了一个简单的clojure编译器,它将clojure代码转换为python代码(这将被上传到clojars)。另外,我还有一个python项目,它将被打包并使pip可安装。我还没有完全包装这两个,虽然他们几乎准备好了。你知道吗

问题

用户在clojure中指定一个模型,然后将该模型编译为python,其中输出为<user_model_name>.py,此输出具有类结构。然后,我拥有的python包获取python输出并从python输出中提取方法,并对该模型执行推断。然而,这是我第一次做这样的项目,因此我非常需要指针来指导如何实际找到编译过的文件,给定一些文件路径(也许)(最好只是模型名),然后在运行时在python代码中加载该模型。你知道吗

在本地,使用importlib module很容易做到这一点,因为我知道如何将代码定向到输出。但是,一旦这两个软件包都安装在系统上,我真的不知道最好的方法是什么。你知道吗

目标

最终目标是拥有这样的东西:

用户编写模型: (def if-model (foppl-query (let [x1 (sample (normal 0 1)) x2 (sample (normal 0 1))] (if (> x1 0) (observe (normal x2 1) 1) (observe (normal -1 1) 1)) x1)))

然后在终端呼叫中:

lein exec compiler.clj -p if-model.clj

然后用户将编写一个调用python包的脚本:

import ... from <python_package> import inference as infer <user defined parameters> ... run_alg = infer.<inference_obj>(<filename or Path to module>, other_params)

(对于最终用户来说,文件路径可能太多)

导入需要在运行时发生在<inference_obj>()中,这是需要模型类的推理算法的实例。你知道吗

我在google上搜索了high和low,我假设我必须使用importlib库来创建查找器和加载程序,但我不完全确定如何解决这个问题。 第二种方法,虽然我不确定这是否可行,但是使用python中的subprocess模块,在python包中的python模块内编写bash脚本,该脚本调用<user_model_name>.clj上的clojure编译器,然后将一些全局路径变量设置到编译输出所在的位置,这样<python_package>就知道要查找的位置。在终端中,类似这样的东西,python python_bash_script.py <user_model_name>.clj。不过,我真的不确定,所以任何指点都会非常感激。你知道吗

谢谢你花时间看我的问题。你知道吗


Tags: 文件项目方法代码用户name模型路径
1条回答
网友
1楼 · 发布于 2024-05-29 03:34:06

虽然我对你的问题没有直接的答案,但让我来评论一些细节。你知道吗

我相信使用importlib是最简单的选择。一旦您在文件顶部导入了这样一个生成的模块,那么很明显您是否成功地加载了它。你知道吗

在生成Python代码时,我想结果可能只是一个函数,因为Clojure代码也有一个函数。你知道吗

如果Python是您的项目的主要部分,请看Hy language。它是用纯Python实现的Clojure语言的克隆。大部分clojure.core公司函数、不变的数据结构和其他东西都在那里。你知道吗

也许您可以在项目中跳过Clojure,用Hy编写一些Clojure代码

另外,在您的示例中,您在lein实用程序和exec插件中运行Clojure编译器。如果您想分发Clojure编译器,它应该只是uberjar。你知道吗

相关问题 更多 >

    热门问题