2013-02-10 101 views
2

我正在写加载的Python 3.3下字节编译*.pyc文件的应用程序。我分发*.pyc文件,而不及其相应的*.py文件(尝试)保护我的源代码。 (是的,如注意here,试图阻止通过字节编译Python进行反编译并不是最安全的选项,但是如果我发现需要,我总是可以添加其他代码安全措施。)* pyc文件不被发现

但是,发现Python没有加载*.pyc文件,但没有原始文件*.py。 (据PEP 3147,该*.pyc文件都保存在一个目录,其中*.py文件将是。我本公约对我自己的代码以下称为__pycache__子目录。)

在我的项目,该项目使用的Python的早期迭代2.7,余字节编译Python的来源和所生成的文件*.pyc放置到相同的目录中的文件*.py;那工作得很好。显然,Python如何找到__pycache__文件夹存在问题。我究竟做错了什么? (是的,我已经适当设置sys.path;否则,当我将它插入一个调试措施不会被找到*.py文件。)

+0

这样做产生的'.pyc'文件有一个额外的'.cpython-33.'插入?如果是这样,您可以简单地尝试将它们重命名为与模块具有相同的名称。 [这对我来说无论如何都是。] – DSM 2013-02-10 16:24:05

+0

@DSM:没有工作。仍然找不到该模块。 – wjk 2013-02-10 17:09:32

+0

嗯。作品就这样结束了 - 我期待在通过导入我从'fred.cpython-33.pyc'复制从目录'tmp'我加入到了'fred.pyc'文件生成一个'你好,世界'的消息!除去每一个其他文件后的'sys.path'。 – DSM 2013-02-10 17:12:26

回答

2

我复制了*.pyc文件出__pycache__目录,并删除其文件名.cpython-33; Python随后按预期发现它。谢谢,帝斯曼!

3

PEP 3147

如果PY源文件丢失,里面__pycache__的PYC文件将被忽略。这消除了意外陈旧的pyc文件导入问题。

为了向后兼容,Python仍然会支持仅pyc发行版,但只有当pyc文件位于py文件所在的目录时,即不在__pycache__目录中时才会这样做。仅当py源文件丢失时才会导入__pycache__以外的pyc文件。

所以,如果你想只PYC的发行,你必须把你的编译后的文件在同一个地方的.py文件会去。按照PEP,compileall有创造这个确切布局的选项,这样你就不必去复制出来的东西__pycache__,所以检查出来。