未找到*.pyc文件

2 投票
2 回答
4041 浏览
提问于 2025-04-17 15:25

我正在写一个应用程序,它可以加载经过字节编译的 *.pyc 文件,适用于 Python 3.3。我打算只分发 *.pyc 文件,而不提供对应的 *.py 文件,以此来保护我的源代码。(是的,正如这里提到的,单靠字节编译来防止反编译并不是最安全的办法,但如果我发现需要的话,我可以添加其他的代码安全措施。)

不过,我发现 Python 在没有原始 *.py 文件的情况下,无法加载 *.pyc 文件。(根据PEP 3147*.pyc 文件会保存在一个名为 __pycache__ 的子目录中,这个子目录位于 *.py 文件应该在的目录里。我在自己的代码中也遵循了这个约定。)

在我之前的项目中,我使用的是 Python 2.7,当时我将 Python 源代码字节编译后,把生成的 *.pyc 文件放在与 *.py 文件相同的目录下;那样是可以正常工作的。显然,Python 找到 __pycache__ 文件夹的方式出了问题。我哪里做错了?(是的,我已经正确设置了 sys.path;否则在我插入它作为调试措施时,它就找不到 *.py 文件了。)

2 个回答

4

来自 PEP 3147 的内容:

如果找不到.py源文件,那么在 __pycache__ 文件夹里的.pyc文件就会被忽略。这就解决了意外导入过时.pyc文件的问题。

为了兼容旧版本,Python仍然支持只有.pyc文件的分发方式,但前提是这个.pyc文件必须放在.py文件应该放的地方,也就是说,不能放在 __pycache__ 文件夹里。只有在.py源文件缺失的情况下,才会导入放在 __pycache__ 之外的.pyc文件。

所以,如果你想要只分发.pyc文件,你需要把编译好的文件放在和.py文件应该放的同一个地方。根据PEP的说明,compileall 有一个选项可以创建这种确切的布局,这样你就不需要手动把东西从 __pycache__ 里复制出来,所以可以去看看这个功能。

2

我把 __pycache__ 文件夹里的 *.pyc 文件复制出来,然后把文件名里的 .cpython-33 去掉了;这样一来,Python就能正常找到这个文件了。谢谢你,DSM!

撰写回答