我正在编写一个在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
文件。)
答案 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!