2

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

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

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

4

2 回答 2

3

来自PEP 3147

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

为了向后兼容,Python 仍将支持 pyc-only 发行版,但它仅在 pyc 文件位于 py 文件所在的目录中时才会这样做,即不在__pycache__目录中。pyc 文件__pycache__只有在缺少 py 源文件时才会被导入。

因此,如果您想制作仅 pyc 的发行版,则必须将已编译的文件放在与 .py 文件相同的位置。根据 PEPcompileall的说法,可以选择创建这种精确的布局,这样您就不必__pycache__从 .

于 2013-02-13T22:16:03.540 回答
2

*.pyc我将文件从__pycache__目录中复制出来并.cpython-33从其文件名中删除;Python 然后按预期找到了它。谢谢,帝斯曼!

于 2013-02-13T21:46:43.130 回答