是否有可能讓Python將.pyc
文件保存到位於sys.path
的單獨文件夾位置?如何將python文件編譯到單獨的文件夾中?
/code
foo.py
foo.pyc
bar.py
bar.pyc
要:
/code
foo.py
bar.py
/code_compiled
foo.pyc
bar.pyc
我想這是因爲我覺得它會是更有條理。感謝你給與我的幫助。
是否有可能讓Python將.pyc
文件保存到位於sys.path
的單獨文件夾位置?如何將python文件編譯到單獨的文件夾中?
/code
foo.py
foo.pyc
bar.py
bar.pyc
要:
/code
foo.py
bar.py
/code_compiled
foo.pyc
bar.pyc
我想這是因爲我覺得它會是更有條理。感謝你給與我的幫助。
有PEP 304: Controlling Generation of Bytecode Files。其狀態是Withdrawn
和相應的patch被拒絕。因此可能沒有直接的辦法。
如果您不需要源代碼,那麼您可以刪除*.py
文件。 *.pyc
文件可以按原樣使用或包裝在雞蛋中。
更新:[PYC版本庫目錄](http://www.python.org/dev/peps/pep-3147/) – jfs 2011-07-09 16:50:48
您可以通過更新內容來編輯您的答案。 – 2012-09-10 13:49:25
「我覺得它會更有條理」爲什麼?怎麼樣?你想達到什麼目的?
保存編譯器輸出的目的是在模塊被導入時節省一小部分的加載時間。爲什麼讓這更復雜?如果您不喜歡.pyc,請定期運行「刪除所有.pyc」腳本。
它們不是必需的;他們很有幫助。爲什麼要關閉幫助?
這不是C,C++或Java,其中生成的對象是必不可少的。這只是Python恰好使用的緩存。我們在Subversion中將它們標記爲「忽略」,因此它們不會意外收到檢入。
我同意,將您的代碼作爲一個雞蛋分發是保持其組織的好方法。什麼可能比單個文件更有組織,包含您需要的所有代碼和元數據。改變字節碼編譯器的工作方式只會造成混淆。
如果你真的不喜歡這些pyc文件的位置,另一種方法是從只讀文件夾運行。由於python無法寫入,所以沒有pyc文件。你打的是每個python文件在加載後都要重新編譯,不管你是否改變了它。這意味着你的啓動時間會變得更糟。
我不同意。原因是錯誤的,或者至少沒有很好地制定;但方向是有效的。能夠從編譯對象中分離源代碼有很好的理由。下面是其中的一些(我所遇到過的所有這些或那一點):
有所有這些問題的解決方法,但他們大多是變通解決方案。在大多數情況下,適當的解決方案是讓軟件接受替代位置來存儲和查找這些過渡文件。
如果你願意一起爲它犧牲字節碼生成,有一個命令行標誌:
python -B file_that_imports_others.py
可裝入IDE的構建/運行的喜好
目前正在進行賽前即會enable building bytecode to magic directory 。
基本上所有的python文件都會被編譯到目錄__pythoncache__
。
因爲Python 3.2已經實現PEP 3147:這意味着所有的pyc文件是一個__ pycache __目錄中生成(會有一個__ pycache __目錄爲每個在這裏你有目錄Python文件,並且它將保存源上使用的每個Python版本的.pyc文件)
在2003年黑暗和古老的日子裏,PEP 304出現來挑戰這個問題。它的補丁被發現想要。環境變量平臺的依賴關係和版本傾斜將其撕成碎片,並將其零星散落在荒地中。
經過多年的痛苦,一個新的挑戰者上漲在2009年巴里華沙召喚PEP 3147的最後日子裏,把它做戰,揮舞帶有技能的簡單武器。 PEP壓制了混亂的PYC文件,壓制了Unladen Swallow和CPython解釋器,每個試圖爭辯它的PYC文件都應該是勝利的,並允許Python在夜深人靜的時候偶爾運行它的死亡幽靈。 PEP 3147被獨裁者發現是值得的,並在3.2的日子被封爲官方角色。
從3.2開始,Python將模塊的PYC文件存儲在模塊目錄下的__pycache__
中。每個PYC文件都包含解釋器的名稱和版本,例如__pycache__/foo.cpython-33.pyc
。您可能還有一個由早期版本的Python編譯的__pycache__/foo.cpython-32.pyc
。正確的魔術發生了:如果與源代碼不同步,使用正確的魔法並重新編譯。在運行時,查看模塊的mymodule.__cached__
pyc文件名並使用imp.get_tag()
解析它。有關更多信息,請參閱the What's New section。
TL; DR - 只適用於Python 3.2及以上版本。可憐的黑客替換之前的版本。
你如何試用Python 3.2?它實現PEP 3147:PYC存儲庫目錄(http://www.python.org/dev/peps/pep-3147/)。 – 2012-08-07 16:27:09
如果你不關心.pyc文件,你可以在腳本的末尾使用`os.system('del * .pyc')`(例如windows)。 – Charlie 2016-07-26 15:51:36