2013-02-10 59 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__,所以檢查出來。