2016-12-28 88 views
0

根據我客戶的要求,我需要發佈一個封閉的源代碼python程序,只有* .pyc文件,並且必須通過pypy運行。PyPy找不到只包含* .pyc文件的模塊

該方案具有其中各種模塊被導入的子目錄:

start.pyc 
backends/ 
    server.pyc 
    ... 

start.py進口backends.server的第一行,並在標準的「蟒」模式下運行時它的工作原理。 但是,如果我脫光所有的* .py文件,並嘗試運行

(pypy)[email protected]:~ python start.pyc 

Traceback (most recent call last): 
    File "./start.py", line 4, in <module> 
ImportError: No module named backends.server 

我得到一個錯誤說沒有模塊名爲「後臺」被發現,即使在「後端」子目錄是存在的,並且服務器.pyc文件在那裏。

我記得有一個切換pypy正是這種行爲,但我似乎無法找到它了。任何幫助?

PS這是我們在嵌入式ARM系統上使用的pypy/python版本。

Python 2.7.10 (c95650101a99, Sep 06 2016, 11:02:19) 
[PyPy 5.4.1 with GCC 4.7.2 20120731 (prerelease)] 
+0

'.pyc'文件包含CPython字節碼。 PyPy有它自己的內部代碼表示,使得(據我所知)'.pyc'文件與PyPy不兼容。同樣的問題在這個郵件列表上被詢問:https://mail.python.org/pipermail/pypy-dev/2011-May/007395.html –

+0

這似乎很奇怪,因爲從PyPy venv我可以啓動'python -m compileall 。 '並重新生成我的項目的所有* .pyc。我猜是PyPy以Pypy兼容的方式生成的。此外,如果我用pypy執行pyc文件,它會給我上面的錯誤,這與pyc中的內容(即導入)有意義和一致。 – zontar

回答

0

這裏是啓用加載孤立的.pyc文件(大部分未經測試但應該工作)的方法。你需要從源到翻譯pypy:如果混淆爲目標

cd pypy/goal 
./rpython -Ojit targetpypystandalone.py --objspace-lonepycfiles 

,那麼你也可以寫自己的導入掛鉤,並從自己的自定義文件格式的加載模塊(當時它在標準PyPy作品) 。

最後,我不確定,但我認爲.pyc文件仍然可以從.zip文件中找到並加載。因此,如果將應用程序的.pyc文件打包到.zip中,並使.zip可用於普通導入機制(我認爲這意味着將.zip文件本身的路徑添加到sys.path中),那麼它應該在標準的PyPy也是如此。

有關輕鬆將反向工程.pyc文件返回到.py文件的常見評論適用。

+0

謝謝,但用rpython翻譯不起作用,因爲我似乎沒有在機器上有rpython。我記得在幾個月前以一種更簡單的方式來做這件事。並且命令行開關--objspace-lonepycfiles不被pypy識別(無論是單獨的還是雙重的破折號,它都被視爲未知選項)。也許我正在調用錯誤的方式? – zontar

+0

這不是您可以在運行時給pypy的選項。如果您不想調查如何翻譯自定義pypy,請嘗試使用.zip選項。 –

+0

謝謝,但你能更具體嗎?在將所有內容打包到zip中之前,我需要在導入說明中更改某些內容?你有除https://docs.python.org/2/library/zipimport.html之外的鏈接嗎?謝謝 – zontar