我正在编写一个在Python3.3下加载字节编译的*.pyc文件的应用程序。我正在分发没有相应*.py文件的*.pyc文件,以(试图)保护我的源代码。(是的,正如前面提到的here,尝试通过字节编译Python来阻止反编译不是最安全的选择,但如果我发现需要的话,我总是可以添加其他代码安全措施。)
但是,我发现在没有原始*.py文件的情况下,Python无法加载*.pyc文件。(根据PEP 3147的说法,*.pyc文件保存在*.py文件所在目录中名为__pycache__的子目录中。我正在用我自己的代码遵循这个约定。)
在我的项目使用Python2.7的早期迭代中,我对Python源代码进行了字节编译,并将生成的*.pyc文件放在与*.py文件相同的目录中;这样做效果很好。显然,Python查找__pycache__文件夹的方式存在问题。我做错了什么?(是的,我已经适当地设置了sys.path;否则,当我插入*.py文件作为调试措施时,它将找不到它。)
发布于 2013-02-14 05:46:43
我从__pycache__目录中复制了*.pyc文件,并从其文件名中删除了.cpython-33;然后,Python如期找到了它。谢谢,DSM!
发布于 2013-02-14 06:16:04
来自PEP 3147
如果py源文件丢失,
__pycache__中的pyc文件将被忽略。这消除了意外导入过时的pyc文件的问题。
为了向后兼容,Python将仍然支持仅支持py的发行版,但是只有当py文件位于py文件所在的目录中时,Python才会这样做,即不在__pycache__目录中。只有当py源文件丢失时,__pycache__外部的py文件才会被导入。
因此,如果您想要制作仅适用于pyc的发行版,则必须将编译后的文件放在与.py文件相同的位置。根据PEP的说法,compileall可以选择创建这种精确的布局,这样你就不需要从__pycache__中复制东西了,所以请查看它。
https://stackoverflow.com/questions/14799730
复制相似问题