gpt4 book ai didi

python - 如何导入 .pyc 编译的 python 文件并使用它

转载 作者:行者123 更新时间:2023-11-30 23:01:57 30 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 python 脚本中包含 .pyc 文件。

例如我的脚本被称为:

myscript.py

我想包含的脚本名为:

included_script.pyc

那么,我是否只使用:

import included_script

这会自动执行 included_script.pyc 吗?或者我还需要做些什么才能让我的 included_script.pycmyscript.py 中运行?

我还需要传递 included_script.pyc 中使用的变量吗?如果是这样,如何实现?

最佳答案

不幸的是,,这不能自动完成。 当然,您可以以极其丑陋的方式手动执行此操作。

<小时/>

设置:

出于演示目的,我将首先生成一个 .pyc 文件。为此,我们首先需要一个 .py 文件。我们的示例 test.py 文件如下所示:

def foo():
print("In foo")

if __name__ == "__main__":
print("Hello World")

super 简单。可以使用 py_compile 生成 .pyc 文件。 在标准库中找到的模块。我们只需通过以下方式传入 .py 文件的名称和 .pyc 文件的名称:

 py_compile.compile('test.py', 'mypyc.pyc')

这会将 mypyc.pyc 放置在我们当前的工作目录中。

<小时/>

.pyc文件获取代码:

现在,.pyc 文件包含按以下方式构造的字节:

  • 前 4 个字节表示“魔数(Magic Number)”
  • 接下来的 4 个字节保存修改时间戳
  • 其余内容已整理 code对象。

我们想要的是编码的code对象,所以我们需要import marshal 对其进行解码并执行。此外,我们确实不关心/不需要前 8 个字节,并且不允许使用它们对 .pyc 文件进行编码,因此我们将忽略它们(seek经过他们):

import marshal

s = open('mypyc.pyc', 'rb')
s.seek(8) # go past first eight bytes
code_obj = marshal.load(s)

所以,现在我们有了 test.py 的精美 code 对象,它是有效的,可以按照我们的意愿执行。 我们有两个选择:

  1. 在当前global命名空间中执行它。这将绑定(bind)当前命名空间中 .pyc 文件内的所有定义,并将充当一种:from file import * 语句。

  2. 创建一个新的模块对象并执行模块内的代码。这就像导入文件语句。

<小时/>

模拟from file import *类似行为:

执行此操作非常简单,只需执行以下操作即可:

exec(code_obj)

这将执行当前命名空间中 code_obj 中包含的代码,并绑定(bind)其中的所有内容。调用后我们可以像任何其他函数一样调用 foo :

foo()
# prints: In foo!

注意:exec() 是内置函数。

<小时/>

模拟导入文件类似行为:

这包括另一个要求, types模块。这包含 ModuleType 的类型 我们可以用它来创建一个新的模块对象。它需要两个参数,模块的名称(强制)和它的文档(可选):

m = types.ModuleType("Fancy Name", "Fancy Documentation")

print(m)
<module 'Fancy Name' (built-in)>

现在我们有了模块对象,我们可以再次使用 exec 来执行模块命名空间内 code_obj 中包含的代码(即 m.__dict__ ):

exec(code_obj, m.__dict__)

现在,我们的模块 m 拥有 code_obj 中定义的所有内容,您可以通过运行来验证这一点:

m.foo() 
# prints: In foo
<小时/>

这些是您可以在模块中“包含”.pyc 文件的方法。至少,我能想到的方法。我真的不认为这有什么实用性,但是嘿,我不是来评判的。

关于python - 如何导入 .pyc 编译的 python 文件并使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34709390/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com