当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')
我怎么能这么做?
您需要添加一个自定义导入挂钩。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 加载脚本。