当前位置: 首页 > 面试题库 >

如何用其依赖项腌制python函数?

齐承泽
2023-03-14
问题内容

作为此问题的后续措施:
是否有一种简单的方法来腌制python函数(或以其他方式序列化其代码)?

我想从上面的帖子中看到此项目符号的示例:

“如果函数引用需要拾取的全局变量(包括导入的模块,其他函数等),则也需要对它们进行序列化,或在远程端重新创建它们。我的示例只是为它提供了远程进程的全局命名空间。

我有一个简单的测试,可以使用marshal将功能字节代码写入文件:

def g(self,blah): 
    print blah

def f(self):
    for i in range(1,5):
        print 'some function f'
        g('some string used by g')

data = marshal.dumps(f.func_code)

file = open('/tmp/f2.txt', 'w')
file.write(data)

然后启动一个新的python实例:

file = open('/tmp/f2.txt', 'r')
code = marshal.loads(file.read())
func2 = types.FunctionType(code, globals(), "some_func_name");
func2('blah')

结果是:

NameError: global name 'g' is not defined

这与我对g所采用的不同方法无关。我尝试过使用与发送g相同的方法,但是f仍然看不到g。如何将g放入全局名称空间,以便f在接收过程中可以使用它?

有人还建议您看一下pyro,以此为例。我已经尝试尝试理解迪斯科项目中的相关代码。我上了他们的dPickle类,并尝试在独立应用程序中重新创建其disco /
tests / test_pickle.py功能,但未成功。我的实验在使用dumps调用进行功能封送处理时遇到了问题。无论如何,下一步可能是火成岩勘探。

总而言之,我所追求的基本功能是能够通过电线发送方法,并随其发送所有基本的“工作区”方法(例如g)。

答案有变化的示例:

工作函数编写器:

import marshal, types

def g(blah): 
    print blah


def f():
    for i in range(1,5):
        print 'some function f'
        g('blah string used by g')


f_data = marshal.dumps(f.func_code)
g_data = marshal.dumps(g.func_code);

f_file = open('/tmp/f.txt', 'w')
f_file.write(f_data)

g_file = open('/tmp/g.txt', 'w')
g_file.write(g_data)

工作功能阅读器:

import marshal, types

f_file = open('/tmp/f.txt', 'r')
g_file = open('/tmp/g.txt', 'r')

f_code = marshal.loads(f_file.read())
g_code = marshal.loads(g_file.read())

f = types.FunctionType(f_code, globals(), 'f');
g = types.FunctionType(g_code, globals(), 'g');

f()

问题答案:

我尝试过使用与发送g相同的方法,但是f仍然看不到g。如何将g放入全局名称空间,以便f在接收过程中可以使用它?

将其分配给全局名称g。(我看到您正在分配ffunc2而不是f。如果您正在使用进行类似的操作g,那么很清楚为什么f找不到g。请记住,名称解析g是在运行时发生的-
在您调用之前不会查找f。)

当然,我在猜测,因为您没有显示用于执行此操作的代码

最好创建一个单独的字典,以用于要取消选择的功能的全局名称空间-沙箱。这样,它们的所有全局变量都将与您在其中执行的模块分离。因此,您可以执行以下操作:

sandbox = {}

with open("functions.pickle", "rb") as funcfile:
    while True:
        try:
            code = marshal.load(funcfile)
        except EOFError:
             break
        sandbox[code.co_name] = types.FunctionType(code, sandbox, code.co_name)

在此示例中,我假设您已将所有函数中的代码对象一个文件一个文件地放置在另一个文件中,并且在读入它们时,我得到了代码对象的名称并将其用作两个功能对象名称的基础以及存储在沙箱字典中的名称。

在未选取的函数内部,沙盒字典就是它们的字典globals(),因此在内部f()g从中获取其值sandbox["g"]。打电话给f是:sandbox["f"]("blah")



 类似资料:
  • 问题内容: 由于缺乏对我想使用的某些库的支持,我将一些Python开发从Windows迁移到Linux开发。我整天的大部分时间都在搞弄依赖关系无所适从。 问题 每当我选择Linux时,无论是通过apt-get,easy_install还是pip进行安装,我通常都会遇到某种依赖问题,通常与开发库有关。我本可以将几天的时间浪费在应该是简单的任务上,而不是编写代码,而要花更长的时间使库工作。 在哪里可以

  • 我想知道下面是否可行以及如何实现。 我正在学习Spring boot的教程,其中提到我们可以有一个父依赖项。 然后定义没有版本号的依赖项。 这将在项目依赖项中添加依赖项版本1.5.6。释放sping-boot-starter和sping-boot-starter-web。 就像那样,我想找到什么是<代码> Spring-上下文 spring-jdbc Spring测试 谢谢!

  • 有没有办法使用JAVA将第三方jars添加到Azure函数中。我需要json-简单jar和jackson-数据库ind jars才能在运行时用于函数。现在,我的代码抛出一个运行时异常(ClassNotExctive),因为函数在运行时无法引用jar,因为它不可用。 我试着使用maven shade插件。它确实创建了一个包含外部jar的可执行jar,但部署仍然使用原始jar。 请建议。 谢谢。 波姆

  • 我使用的是Android studio版本 在项目级分级中: 模块级别等级: 当我导入它时,它发生错误 导入此时 xml错误 错误图片 在xml中添加此标记时发生错误 为此给出解决方案!!!

  • npm是否有安装依赖作为对等依赖的选项,如yarn选项,而不是手动添加它例如: 感谢@Broncha,更新问题的更多说明 问题是如何向项目添加对等依赖。那就是 将依赖项添加到package.json中的“dependencies”中, 如何安装将其添加到package.json?中的“对等依赖”的依赖项

  • 问题内容: 有什么方法可以强制安装pip python软件包,而忽略所有无法满足的依赖关系吗? (我不在乎这样做有多“错”,我只需要这样做,除了逻辑和推理之外……) 问题答案: 点有一个开关。您应该使用它。 有关更多信息,请运行,在这里您将看到以下行: