未找到*.pyc文件
我正在写一个应用程序,它可以加载经过字节编译的 *.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 个回答
来自 PEP 3147 的内容:
如果找不到.py源文件,那么在
__pycache__
文件夹里的.pyc文件就会被忽略。这就解决了意外导入过时.pyc文件的问题。为了兼容旧版本,Python仍然支持只有.pyc文件的分发方式,但前提是这个.pyc文件必须放在.py文件应该放的地方,也就是说,不能放在
__pycache__
文件夹里。只有在.py源文件缺失的情况下,才会导入放在__pycache__
之外的.pyc文件。
所以,如果你想要只分发.pyc文件,你需要把编译好的文件放在和.py文件应该放的同一个地方。根据PEP的说明,compileall
有一个选项可以创建这种确切的布局,这样你就不需要手动把东西从 __pycache__
里复制出来,所以可以去看看这个功能。
我把 __pycache__
文件夹里的 *.pyc
文件复制出来,然后把文件名里的 .cpython-33
去掉了;这样一来,Python就能正常找到这个文件了。谢谢你,DSM!