当前位置: 首页 > 知识库问答 >
问题:

IronPython--是否有一种方法可以从数据库加载python脚本,或者从字符串资源嵌入python脚本?

经博延
2023-03-14

当IronPython试图解析/加载一个找不到的模块时,是否有一种方法可以从它身上捕捉到某种甚至?

我们希望将模块存储在数据库中或嵌入到DLL中,并通过调用import mymodule导入它们。我们根本不想涉及文件系统。当我们说import something时,我们不希望它在\lib或任何文件系统中查找。

下面的代码可以很好地加载嵌入在DLL中的Python块。它只在没有导入时工作。

    var myScript = new StreamReader(Assembly.GetAssembly(this.GetType()).GetManifestResourceStream("Resource.Name.To.My.Script")).ReadToEnd()
    var engine = IronPython.Hosting.Python.CreateEngine();
    var scope = engine.CreateScope();
    var result = engine.Execute(myScript, scope);
print('hello world')

我怎么能这么做?

共有1个答案

漆雕安晏
2023-03-14

您需要添加一个自定义导入挂钩。Python添加了一种注册自定义导入钩子的方法。在此机制之前,必须重写内置的__import__函数。但它特别容易出错,尤其是当多个库都试图添加自定义导入行为时。

PEP 0302详细描述了该html" target="_blank">机制。

实际上,您需要创建两个对象--查找器对象和加载器对象。

将使用模块的完全限定名调用此方法。如果查找器安装在sys.meta_path上,它将接收第二个参数,对于顶级模块,该参数为None,对于子模块或子包,该参数为package.__path__[5]。如果找到了模块,它应该返回一个加载器对象,如果没有,它应该返回一个不加载器对象。

如果find_module函数找到模块并返回加载器对象,则加载器对象应定义load_module函数

此方法返回加载的模块或引发异常,如果未传播现有异常,则最好是ImporDerrore。如果请求load_module()加载一个它不能加载的模块,则将引发imporderarm。

import sys
import imp

class CustomImportFinder(object):

    @staticmethod
    def find_module(fullname, path=None):
        # Do your custom stuff here, look in database, etc.
        code_from_database = "VAR = 1"
        return CustomImportLoader(fullname, path, code_from_database)


class CustomImportLoader(object):

    def __init__(self, fullname, path, code_from_database):
        super(CustomImportLoader, self).__init__()
        self.fullname = fullname
        self.path = path
        self.code_from_database = code_from_database

    def is_package(fullname):
        # is this a package?
        return False

    def load_module(self, fullname):
        code = self.code_from_database
        ispkg = self.is_package(fullname)
        mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
        mod.__file__ = "<%s>" % self.__class__.__name__
        mod.__loader__ = self
        if ispkg:
            mod.__path__ = []
            mod.__package__ = fullname
        else:
            mod.__package__ = fullname.rpartition('.')[0]
        exec(code, mod.__dict__)
        return mod

sys.meta_path.append(CustomImportFinder)

import blah
print(blah)
# <module 'blah' (built-in)>
print(blah.VAR)
# 1
 类似资料:
  • 我是初学者。我已经使用“反应本机运行Android”命令在Ubuntu上运行了反应本机项目。我在模拟器上收到错误“无法从资产“index.android.bundle”加载脚本。确保您的包包装正确,或者您正在运行包服务器。”

  • 在使用./gradlew assembledebug构建apk后,我得到了这个错误。如果我用./gradlew assembleRelease构建apk,我会在手机上安装应用程序时出现错误。当我用react-native run-android在虚拟设备中运行相同的应用程序时,应用程序运行良好,没有任何麻烦。有什么想法吗?

  • 问题内容: 我有一个长期运行的python脚本,希望能够从另一个python脚本结束。理想情况下,我正在寻找一种将进程ID设置为第一个脚本并能够从第二个脚本通过该ID查看其是否正在运行的方法。此外,我希望能够终止该长时间运行的过程。 有没有很酷的捷径可以实现这一目标? 另外,我在Windows环境中工作。 我最近在这里找到了另一种答案:检查python脚本是否正在运行 问题答案: 您可以通过以下方

  • 问题内容: 我想从另一个Python脚本运行一个Python脚本。我想像使用命令行一样传递变量。 例如,我会跑我的,将通过值(0,1,2,3)的列表迭代第一个脚本,并通过那些到第二脚本,然后,等 我发现了Stack Overflow问题1186789,这是一个类似的问题,但是ars的答案调用了一个函数,在这里我想运行整个脚本,而不仅仅是函数,而balpha的答案则调用了脚本,但没有参数。我将其更改

  • 为了在IronPython中使用外部dll,我必须将一个字符串传递给一个char数组(在C++.NET中是char var[len];)。似乎期望传递一个SByte数组。 如果我尝试 我得到 网上的信息很少。到目前为止,我发现我可以应用这样的内容:

  • 我已经使用 命令在 Windows 上运行了一个 React Native 项目。我在模拟器中收到以下错误: 无法从资产' index.android.bundle '加载脚本。请确保您的软件包已正确打包,或者您正在运行软件包服务器。 我试过这些链接,但不管用。 无法从 Windows 上的 assets index.android.bundle 加载脚本。