2009-01-23 85 views
27

是否有可能讓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 

我想這是因爲我覺得它會是更有條理。感謝你給與我的幫助。

+0

你如何試用Python 3.2?它實現PEP 3147:PYC存儲庫目錄(http://www.python.org/dev/peps/pep-3147/)。 – 2012-08-07 16:27:09

+0

如果你不關心.pyc文件,你可以在腳本的末尾使用`os.system('del * .pyc')`(例如windows)。 – Charlie 2016-07-26 15:51:36

回答

17

PEP 304: Controlling Generation of Bytecode Files。其狀態是Withdrawn和相應的patch被拒絕。因此可能沒有直接的辦法。

如果您不需要源代碼,那麼您可以刪除*.py文件。 *.pyc文件可以按原樣使用或包裝在雞蛋中。

+3

更新:[PYC版本庫目錄](http://www.python.org/dev/peps/pep-3147/) – jfs 2011-07-09 16:50:48

+0

您可以通過更新內容來編輯您的答案。 – 2012-09-10 13:49:25

-1

「我覺得它會更有條理」爲什麼?怎麼樣?你想達到什麼目的?

保存編譯器輸出的目的是在模塊被導入時節省一小部分的加載時間。爲什麼讓這更復雜?如果您不喜歡.pyc,請定期運行「刪除所有.pyc」腳本。

它們不是必需的;他們很有幫助。爲什麼要關閉幫助?

這不是C,C++或Java,其中生成的對象是必不可少的。這只是Python恰好使用的緩存。我們在Subversion中將它們標記爲「忽略」,因此它們不會意外收到檢入。

3

我同意,將您的代碼作爲一個雞蛋分發是保持其組織的好方法。什麼可能比單個文件更有組織,包含您需要的所有代碼和元數據。改變字節碼編譯器的工作方式只會造成混淆。

如果你真的不喜歡這些pyc文件的位置,另一種方法是從只讀文件夾運行。由於python無法寫入,所以沒有pyc文件。你打的是每個python文件在加載後都要重新編譯,不管你是否改變了它。這意味着你的啓動時間會變得更糟。

3

我不同意。原因是錯誤的,或者至少沒有很好地制定;但方向是有效的。能夠從編譯對象中分離源代碼有很好的理由。下面是其中的一些(我所遇到過的所有這些或那一點):

  • 嵌入式設備讀取ROM,但能夠使用RAM中的內存文件系統。
  • 多用戶開發環境意味着共享(與桑巴/ nfs /無論)我的工作目錄和建設在多個平臺上。
  • 商業公司希望只分發PYC使用相同的工作目錄
  • 更容易清理過渡性文件(RM -rf $ OBJECT_DIR,而不是尋找保護IP
  • 輕鬆地運行測試套件蟒蛇的多個版本。-name'* .pyc'-exec rm -f {} \;)

有所有這些問題的解決方法,但他們大多是變通解決方案。在大多數情況下,適當的解決方案是讓軟件接受替代位置來存儲和查找這些過渡文件。

2

如果你願意一起爲它犧牲字節碼生成,有一個命令行標誌:

python -B file_that_imports_others.py 

可裝入IDE的構建/運行的喜好

1

因爲Python 3.2已經實現PEP 3147:這意味着所有的pyc文件是一個__ pycache __目錄中生成(會有一個__ pycache __目錄爲每個在這裏你有目錄Python文件,並且它將保存源上使用的每個Python版本的.pyc文件)

14

在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及以上版本。可憐的黑客替換之前的版本。

相關問題