2008-09-30 145 views

回答

262

"What’s New in Python 2.6 - Interpreter Changes"設置:

Python的現在可以從 寫.pyc文件或.pyo文件被阻止 在運行 解釋器之前,將-B切換到Python 解釋器,或通過設置 PYTHONDONTWRITEBYTECODE環境 變量。此設置可用 作爲Python程序的 sys.dont_write_bytecode變量和 Python代碼可以將值更改爲 修改解釋器的行爲。

更新2010-11-27:Python的3.2地址通過引入一種特殊的__pycache__子塞滿與.pyc文件的源文件夾的問題,請參閱What's New in Python 3.2 - PYC Repository Directories

+1

至少在運行Python 2.7的OS X 10.8上,環境變量沒有效果。 – sorin 2012-11-29 13:53:29

+2

如果您正在嵌入解釋器(在C++程序中),請使用「Py_DontWriteBytecodeFlag = 1;」在你的源代碼中。這是一個在pydebug.h中聲明的全局int。 – JimB 2014-01-04 09:56:56

1

據我所知python會編譯你「導入」的所有模塊。然而,python不會編譯使用「python script.py」運行的python腳本(它將編譯腳本導入的任何模塊)。

真正的問題是爲什麼你不希望python編譯模塊?如果他們擋道,你可能會自動清理這些東西。

+0

我經常發現下面有陳舊的字節碼`.pyc`文件。出於某種原因,當我更改類/模塊時,`.pyc`文件不會被更新。所以當我在更改`.py`文件後導入它時,它仍然會使用`.pyc`文件,導致錯誤 – 2018-02-10 01:27:10

1

您可以將Python解釋器運行的用戶以只讀方式創建模塊存在的目錄。

我不認爲有更優雅的選擇。 PEP 304似乎試圖爲此引入一個簡單的選項,但它似乎已被放棄。

我想你可能還有其他問題想要解決,因爲禁用.py [co]似乎是一種解決方法,但它可能會更好地攻擊這個原始問題。

9

在2.5中,除了不給用戶寫目錄的權限外,沒有辦法壓制它。

但是,在Python 2.6和3.0中,sys模塊中可能存在一個名爲「dont_write_bytecode」的設置,可以將其設置爲禁止此設置。這也可以通過將「-B」選項,或者設置環境變量「PYTHONDONTWRITEBYTECODE」

22

實際上有一種方法可以在Python 2.3+中完成,但它有點深奧。我不知道你是否意識到這一點,但你可以做到以下幾點:

$ unzip -l /tmp/example.zip 
Archive: /tmp/example.zip 
    Length  Date Time Name 
-------- ---- ---- ---- 
    8467 11-26-02 22:30 jwzthreading.py 
--------     ------- 
    8467     1 file 
$ ./python 
Python 2.3 (#1, Aug 1 2003, 19:54:32) 
>>> import sys 
>>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path 
>>> import jwzthreading 
>>> jwzthreading.__file__ 
'/tmp/example.zip/jwzthreading.py' 

按照zipimport庫:

任何文件可能存在於ZIP壓縮文件,但只有文件。 py和.py [co]可用於導入。動態模塊(.pyd,.so)的ZIP導入是不允許的。請注意,如果存檔文件僅包含.py文件,則Python不會嘗試通過添加相應的.pyc或.pyo文件來修改存檔文件,這意味着如果ZIP存檔文件不包含.pyc文件,則導入可能會很慢。

因此,所有你需要做的就是壓縮文件,將zip文件添加到你的sys.path然後導入它們。

如果您正在爲UNIX構建此應用程序,您也可以考慮使用以下配方打包您的腳本:unix zip executable,但請注意,如果您打算使用stdin或從sys.args讀取任何內容,則可能需要調整此腳本可以做到沒有太多麻煩)。

根據我的經驗,性能不會因此受到太多影響,但在以這種方式導入任何非常大的模塊之前,您應該考慮三次。

91
import sys 

sys.dont_write_bytecode = True 
2

我有幾個測試用例的測試套件,我正在運行測試套件中的Mac終端這樣前:

python LoginSuite.py 

運行命令這樣我的目錄已被填充與.pyc文件。我嘗試了以下所述方法,它解決了這個問題:

python -B LoginSuite.py 

此方法如果要導入測試用例到測試套件運行在命令行上的套件。

6

你可以在你的源代碼中設置sys.dont_write_bytecode = True,但是這將不得不在加載的第一個python文件中。如果你執行python somefile.py那麼你將不會得到somefile.pyc

當您使用setup.pyentry_points=安裝實用程序時,您將在啓動腳本中設置sys.dont_write_bytecode。所以你不能依賴由setuptools生成的「默認」啓動腳本。

如果你使用python文件作爲參數,自己開始Python中,你可以指定-B

python -B somefile.py 

somefile.pyc不會產生無論如何,但進口沒有.pyc文件等文件了。

如果你有一些實用程序myutil,你不能改變它,它不會傳遞-B到Python解釋器。僅僅通過設置環境變量PYTHONDONTWRITEBYTECODE啓動:

PYTHONDONTWRITEBYTECODE=x myutil 
0

解決方案ipython 6.2.1 using python 3.5.2(測試在Ubuntu 16.04和Windows 10):

Ipython如果在ipython解釋器或在啓動時設置不尊重%env PYTHONDONTWRITEBYTECODE =1~/.ipython/profile-default/startup/00-startup.ipy。 而不是使用您的~.ipython/profile-default/startup/00-startup.py

import sys 
Sys.dont_write_bytecode=True