能否导入已编译的Python文件?

24

我似乎无法弄清楚如何将已编译的.pyc模块导入到我的代码中,以便在主脚本中使用它。这样做是可能的吗?


仅供参考。PyDev在导入pyc文件时存在一个bug。https://dev59.com/E2zXa4cB1Zd3GeqPSVEE - smwikipedia
6个回答

23

在解释器(IPython)中,我的导入无法正常工作。我在脚本中进行了测试,它可以正常工作。这是否可以在解释器中完成? - Jonno
1
没事了,找到问题了,我在错误的工作目录中。感谢你的帮助。 - Jonno

15
简而言之,要导入Python编译文件(例如module.pyc),只需将其放置在与源文件(例如module.py)相同的目录中,并确保没有相应的源文件(例如我们示例中的module.py)。然后通常的import module就可以无缝运行。
如果在编译文件所在的目录中有源文件,则Python将使用__pycache__目录中的编译文件,或者如果不存在,则重新从源代码编译。
如果您删除了源文件但没有在同一目录中放置“.pyc”文件,则即使编译文件存在于__pycache__目录中,导入也会失败。还要注意,__pycache__下的文件遵循不同的命名约定。如果要复制它们,请确保将它们重命名为与源文件相同的名称,除了扩展名必须是“pyc”而不是“py”。
在PEP 3147中有一个非常好的flow chart,链接在documentation中。

3

使用import时不需要扩展名。Python会检查文件是否已更改,如果没有,则使用先前创建的pyc文件。

但请注意,如果您真的想要更好的性能,我建议您使用PyPy,它比标准的CPython实现要快得多。(但请注意,它仍然是Python 2)


2
这似乎是一则广告;OP没有询问速度,而且作为新手,不太可能关注速度。 - sondra.kinsey
@sondra.kinsey 当有人挖出我以前的SA答案并重新阅读时,我总是觉得很有趣,然后我就会想“哎呀”。你说得对,这并不完全回答了原问题,但是因为我猜测OP的意图,所以在询问如何加载已编译代码时,我想提供一种替代方案。 - evotopid

2

导入模块

如果存在.py源文件,核心将自动使用.pyc文件,如果它是最新的。

如果没有源文件,Python将自动导入.pyc文件。

这里了解更多有关“已编译”Python文件的信息。


3
import filename.py 是无法工作的。在 import 语句中不需要指定 .py 后缀。 - kindall
我该如何从不同的位置导入它? - Gahan
help("import") - Karoly Horvath

1
是的,但要注意用“-O”选项启动Python!根据我的个人经验,如果你只有那个.pyc或.pyo文件,运行不带标志的“python.exe”并尝试导入将失败,然而运行python.exe -O,然后尝试正常导入应该可以成功。

0
在导入时使用pyc文件名,Python会自动加载它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接