* .pyc文件未找到

时间:2013-02-10 16:15:13

标签: python

我正在编写一个在Python 3.3下加载字节编译的*.pyc文件的应用程序。我正在分发*.pyc文件而没有相应的*.py文件来(尝试)保护我的源代码。 (是的,正如所指出的here,尝试通过字节编译来阻止反编译Python并不是最安全的选择,但如果我发现需要,我总是可以添加其他代码安全措施。)

但是,我发现Python没有加载*.pyc文件而没有原始的*.py文件。 (根据PEP 3147*.pyc文件保存在__pycache__文件所在目录中名为*.py的子目录中。我使用自己的代码遵循此约定。)

在我使用Python 2.7的项目的早期迭代中,我对Python源进行了字节编译,并将生成的*.pyc文件放在与*.py文件相同的目录中;工作得很好。显然,Python找到__pycache__文件夹的方式存在问题。我究竟做错了什么? (是的,我已正确设置sys.path;否则当我将其作为调试措施插入时,它将无法找到*.py文件。)

2 个答案:

答案 0 :(得分:3)

来自PEP 3147

  

如果缺少py源文件,将忽略__pycache__内的pyc文件。这消除了意外过时的pyc文件导入问题。

     

为了向后兼容,Python仍然支持仅限pyc的发行版,但是只有当pyc文件存在于py文件所在的目录中时,它才会这样做,即不在__pycache__目录中。只有在缺少py源文件的情况下才会导入__pycache__之外的pyc文件。

因此,如果您想制作仅限pyc的发行版,则必须将编译后的文件放在与.py文件相同的位置。根据PEP,compileall可以选择创建这种确切的布局,这样您就不必复制__pycache__的内容,所以请查看它。

答案 1 :(得分:2)

我从*.pyc目录中复制了__pycache__文件,并从其文件名中删除了.cpython-33;然后Python按预期发现它。谢谢,DSM!