我试图找出如何在python脚本中包含.pyc
文件。
例如我的脚本被调用:
myscript.py
我想要包含的脚本叫做:
included_script.pyc
那么,我只是使用:
import included_script
这会自动执行included_script.pyc
吗?或者我还需要做些什么,让included_script.pyc
在myscript.py
内运行?
我还需要传递included_script.pyc
中使用的变量吗?如果是这样,怎么可能实现呢?
答案 0 :(得分:3)
不幸的是,没有,这不能自动完成。 当然,你可以用坚韧不拔的方式手动。
出于演示目的,我将首先生成.pyc
文件。为此,我们首先需要一个.py
文件。我们的示例test.py
文件如下所示:
def foo():
print("In foo")
if __name__ == "__main__":
print("Hello World")
超级简单。生成.pyc
文件可以使用标准库中的 py_compile
模块完成。我们只是按以下方式传递.py
文件的名称和.pyc
文件的名称:
py_compile.compile('test.py', 'mypyc.pyc')
这会将mypyc.pyc
放在我们当前的工作目录中。
.pyc
文件中获取代码:现在,.pyc
个文件包含以下列方式构造的字节:
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)
所以,现在我们有code
的{{1}}对象是有效的,可以按照我们的意愿执行。 我们在这里有两个选项:
在当前test.py
命名空间中执行它。这将绑定当前命名空间中global
文件中的所有定义,并将作为一种:.pyc
语句。
创建一个新的模块对象并执行模块内的代码。这与from file import *
语句类似。
import file
之类的行为:执行此操作非常简单,只需:
from file import *
这将执行当前命名空间中exec(code_obj)
内包含的代码并绑定其中的所有内容。通话结束后,我们可以像其他任何功能一样致电code_obj
:
foo
注意:foo()
# prints: In foo!
是内置的。
exec()
之类的行为:这包括另一项要求, types
模块。这包含 ModuleType
的类型,我们可以使用它来创建新的模块对象。它需要两个参数,模块的名称(必填)和它的文档(可选):
import file
现在我们有了模块对象,我们可以再次使用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
这些是您可以包含&#39;的方法。模块中的m.foo()
# prints: In foo
文件。至少,我能想到的方式。我真的没有看到这方面的实用性,但嘿,我不能在这里判断。