我可以在不生成編譯後的.pyc文件的情況下運行python解釋器嗎?如何避免.pyc文件?
回答
從"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。
據我所知python會編譯你「導入」的所有模塊。然而,python不會編譯使用「python script.py」運行的python腳本(它將編譯腳本導入的任何模塊)。
真正的問題是爲什麼你不希望python編譯模塊?如果他們擋道,你可能會自動清理這些東西。
我經常發現下面有陳舊的字節碼`.pyc`文件。出於某種原因,當我更改類/模塊時,`.pyc`文件不會被更新。所以當我在更改`.py`文件後導入它時,它仍然會使用`.pyc`文件,導致錯誤 – 2018-02-10 01:27:10
您可以將Python解釋器運行的用戶以只讀方式創建模塊存在的目錄。
我不認爲有更優雅的選擇。 PEP 304似乎試圖爲此引入一個簡單的選項,但它似乎已被放棄。
我想你可能還有其他問題想要解決,因爲禁用.py [co]似乎是一種解決方法,但它可能會更好地攻擊這個原始問題。
在2.5中,除了不給用戶寫目錄的權限外,沒有辦法壓制它。
但是,在Python 2.6和3.0中,sys模塊中可能存在一個名爲「dont_write_bytecode」的設置,可以將其設置爲禁止此設置。這也可以通過將「-B」選項,或者設置環境變量「PYTHONDONTWRITEBYTECODE」
實際上有一種方法可以在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讀取任何內容,則可能需要調整此腳本可以做到沒有太多麻煩)。
根據我的經驗,性能不會因此受到太多影響,但在以這種方式導入任何非常大的模塊之前,您應該考慮三次。
import sys
sys.dont_write_bytecode = True
我有幾個測試用例的測試套件,我正在運行測試套件中的Mac終端這樣前:
python LoginSuite.py
運行命令這樣我的目錄已被填充與.pyc文件。我嘗試了以下所述方法,它解決了這個問題:
python -B LoginSuite.py
此方法如果要導入測試用例到測試套件運行在命令行上的套件。
你可以在你的源代碼中設置sys.dont_write_bytecode = True
,但是這將不得不在加載的第一個python文件中。如果你執行python somefile.py
那麼你將不會得到somefile.pyc
。
當您使用setup.py
和entry_points=
安裝實用程序時,您將在啓動腳本中設置sys.dont_write_bytecode
。所以你不能依賴由setuptools生成的「默認」啓動腳本。
如果你使用python文件作爲參數,自己開始Python中,你可以指定-B
:
python -B somefile.py
somefile.pyc
不會產生無論如何,但進口沒有.pyc
文件等文件了。
如果你有一些實用程序myutil
,你不能改變它,它不會傳遞-B到Python解釋器。僅僅通過設置環境變量PYTHONDONTWRITEBYTECODE
啓動:
PYTHONDONTWRITEBYTECODE=x myutil
解決方案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
- 1. 避免.pyc文件的好處?
- 2. 如何避免覆蓋文件
- 3. 如何讀取文件並避免'EOF'?
- 4. 如何避免預編譯頭文件
- 5. 如何避免? .htaccess文件中
- 6. 如何使用Findbugs避免kotlin文件
- 7. 如何避免objcopy炸燬文件?
- 8. 如何避免文件阻塞
- 9. 如何避免的Thumbs.db文件壓縮
- 10. 如何避免使用selenium webdriver/python運行測試套件時使用.pyc文件?
- 11. 何處使用pyc文件
- 12. 如何避免
- 13. 如何避免
- 14. 如何避免
- 15. 如何避免
- 16. 如何避免
- 17. 刪除* .pyc文件
- 18. WSGI與.pyc文件
- 19. Pydev和* .pyc文件
- 20. 如何避免覆蓋iPhone文檔文件夾上的文件?
- 21. 使ReSharper避免* .designer.cs文件
- 22. 避免以前的文件
- 23. 避免頭文件「污染」
- 24. 避免創建空文件
- 25. 避免的JavaScript文件
- 26. 如何避免android.os.NetworkOnMainThreadException
- 27. 如何避免typedef?
- 28. 如何避免ArrayIndexOutOfBoundsException?
- 29. 如何避免data.table
- 30. 如何避免SynchronizationLockException?
至少在運行Python 2.7的OS X 10.8上,環境變量沒有效果。 – sorin 2012-11-29 13:53:29
如果您正在嵌入解釋器(在C++程序中),請使用「Py_DontWriteBytecodeFlag = 1;」在你的源代碼中。這是一個在pydebug.h中聲明的全局int。 – JimB 2014-01-04 09:56:56