- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试弄清楚如何在 python 脚本中包含 .pyc
文件。
例如我的脚本被称为:
myscript.py
我想包含的脚本名为:
included_script.pyc
那么,我是否只使用:
import included_script
这会自动执行 included_script.pyc
吗?或者我还需要做些什么才能让我的 included_script.pyc
在 myscript.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
文件包含按以下方式构造的字节:
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
对象,它是有效的,可以按照我们的意愿执行。 我们有两个选择:
在当前global
命名空间中执行它。这将绑定(bind)当前命名空间中 .pyc
文件内的所有定义,并将充当一种:from file import *
语句。
创建一个新的模块对象并执行模块内的代码。这就像导入文件
语句。
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/
当我第一次开始使用 Django 应用程序时,我不记得这些文件在那里,并且 Django 教程的文件列表中也没有提到它们 我对此进行了更多研究,发现这些就是所谓的字节码 - 正如 this S.O.
不久前,我不得不将一些服务器从 Python 2.4 升级到 Python 2.5。我发现在 Python 2.4 下创建的 .pyc 文件在 Python 2.5 尝试运行它们时会崩溃。 当我从 2
关于 Python 的 .pyc 文件已经有几个问题,但我还没有读到 1) 何时(在什么情况下)创建这些文件以及 2) 是否有充分的理由保留它们。 更具体地说: 关于 (1):在我运行的 200 个或
根据我所做的测试,使用相同版本的 python(相同的魔数(Magic Number)),64 位解释器可以加载由 32 位版本的 python 生成的 pyc 文件。我假设是相互的。 但是它绝对安全
我有 2 个 Python 文件,名为 numbers.py 和 numpyBasicOps.py。 numbers.py 是一个简单的 Python 文件,没有导入任何模块。 numpyBasicO
我假设标准库类型提示支持全部基于阅读普通源代码,就像 inspect 对某些事情所做的那样,但我查看了 typing.py在标准库中,编译器似乎确实在对象本身上存储了类型提示信息。 所以,如果我这样做
我目前正在开发一个 C# 应用程序,该应用程序应该能够启动多个 Python 解释器。 我读过几篇有关该主题的文章,例如: http://www.awasu.com/weblog/embedding-
我有一个 python 编译的脚本(script.pyc,我没有 .py 文件),它在我的 Windows 命令提示符下运行良好,我想从我的 Java 应用程序中执行它。我尝试使用 runtime()
似乎有时当我从 git 中拉取时,旧的 .pyc 运行而不是新拉取的 .py 文件有没有办法自动清除 .pyc 文件以便它始终运行最新版本? 最佳答案 旧的 .pyc 会被 Python 自动清除,前
我最近开始在树莓派上进行 python 开发。在阅读 .pyc 文件以加速启动时,我想知道如果我在 PC 上测试 .pyc 文件,假设 Rpi 上有相同的 python 模块,它会直接工作吗?还请包括
做的时候: >git status 它在“未跟踪文件”下显示了一个大的 .pyc 文件列表。我不希望它显示这些,因为它会增加噪音。 换句话说,如何让 git 始终忽略所有项目的 .pyc 文件? 编辑
我了解“.pyc”文件是纯文本“.py”文件的编译版本,在运行时创建以使程序运行得更快。但是我观察到一些事情: 修改“py”文件后,程序行为会发生变化。这表明“py”文件已编译或至少经过某种散列过程或
我是 python 的新手,因此是一个愚蠢的问题。 据我所知,在第一次执行 *.py 程序时,字节码会被创建到 *.pyc 中并一直使用到 *.py 文件发生更改。 这个 *.pyc 字节码可以在项目
什么是pyc文件 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由pytho
我有一个使用几个 PY 文件的程序。在我使用 PY 文件之前,代码工作正常。但是,对于加密,当我删除 PY 文件并只保留 PYC 文件时,程序失败并显示消息:ImportError: 没有名为 abc
我有一个使用几个 PY 文件的程序。在我使用 PY 文件之前,代码工作正常。但是,对于加密,当我删除 PY 文件并只保留 PYC 文件时,程序失败并显示消息:ImportError: 没有名为 abc
假设我有一个像这样组织的 python 代码库: ./mod/: ./__init__.py ./main/main.py ./main/__init__.py ./m
我在一个相当大的项目中重命名了一些文件,并想删除它们留下的 .pyc 文件。我尝试了 bash 脚本: rm -r *.pyc 但这并没有像我想象的那样在文件夹中递归。我做错了什么? 最佳答案 fi
昨天使用Google App Engine在python中开发它停止运行当前版本的脚本。它似乎没有执行最新版本,而是运行了先前预编译的 .pyc,即使 .py 源已更改。 错误消息实际上引用了最新来源
pyc 文件在过去一直是痛苦的原因,我最近看到一些关于防止 python 生成它们的帖子。目前,我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的代码,但通常禁用它们会容易得多。在我们的生
我是一名优秀的程序员,十分优秀!