Python工程的編譯、合並、打包、發布
確保要發布的包(demo)的根目錄中有__main__.py文件,這個是程序執行入口。
編譯
python3 -O -m compileall demo
批量改名.pyc文件
find . -name '*.pyc' -exec rename 's/.cpython-35.opt-1//' {} \;
移動.pyc文件
find . -name '*.pyc' -execdir mv {} .. \;
清理.py文件
find . -name '*.py' -type f -print -exec rm {} \;
清理__pycache__文件夾
find . -name '__pycache__' -exec rmdir {} \;
打包成zip
zip -r pub.zip ./demo/*
運行時只要將zip文件作為參數即可
python3 pub.zip
最終整合腳本
cd $1 python3 -O -m compileall . find . -name '*.pyc' -exec rename 's/.cpython-35.opt-1//' {} \; find . -name '*.pyc' -execdir mv {} .. \; find . -name '*.py' -type f -print -exec rm {} \; find . -name '__pycache__' -exec rmdir {} \; zip -r ../$1.zip ./*
調用方式
chmod +x pycompile.sh ./pycompile.sh demo
Python代碼的編譯
from:http://www.cnblogs.com/zhangzl419/p/7116158.html
Python代碼的編譯
Python代碼在解釋執行之前,是會被編譯成.pyc或者.pyo文件的,它們是中間字節碼表示的文件,之后Python虛擬機才會去解釋執行它們。
1、pyc文件
=========
pyc是一種二進制文件,是由py文件經過編譯后,生成的文件,是一種byte code,py文件變成pyc文件后,加載的速度有所提高。
而且pyc是一種跨平台的字節碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。
pyc的內容,是跟python的版本相關的,不同版本編譯后的pyc文件是不同的。
2、pyo文件
==========
pyo是優化編譯后的程序 python -O 源文件即可將源程序編譯為pyo文件。
3、把單個文件編譯成pyc
====================
用如下代碼
import py_compile
py_compile.compile(r'H:\game\test.py')
或者
python -m py_compile test.py
這樣會在test.py文件所在的目錄下,生成一個__pycache__(注意:這里目錄名前后有兩個下划線)的目錄,並且其中存有一個test.cpython-35.pyc文件,這個pyc文件就是test.py編譯之后生成的文件。
4、把一個目錄下所有python源文件編譯pyc
===================================
一般來說,我們的工程都是在一個目錄下的,一般不會說僅僅編譯一個py文件而已,而是需要把整個文件夾下的py文件都編譯為pyc文件,python又為了我們提供了另一個模塊:compileall 。使用方法如下:
import compileall
compileall.compile_dir(r'/root/src')
也可以直接用命令行編譯一個目錄下的文件
python -m compileall /root/src/
這樣就會在/root/src目錄下生成一個新的目錄__pycache__,這個目錄的下面會存放所有的和python源代碼對應的pyc文件
比如源代碼目錄結構如下
/root/src
|---test.py
|---test2.py
|---test3.py
編譯后目錄結構會變成如下:
/root/src
|---test.py
|---test2.py
|---test3.py
|---__pycache__
|----test.cpython-35.pyc
|----test2.cpython-35.pyc
|----test3.cpython-35.pyc
以上就是Python編譯的基本知識。
注意:
compileall.compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1)
字節編譯沿 sys.path 找到的所有 .py 文件。如果所有文件都已成功編譯,則返回true值,否則返回false值。
如果 skip_curdir 為true(默認值),則當前目錄不包括在搜索中。所有其他參數傳遞到 compile_dir() 函數。注意,與其他編譯函數不同,maxlevels 默認為 0。
在 3.2 版更改: 添加了 legacy 和 optimize 參數。
在 3.5 版更改: quiet 參數更改為多級值。
在 3.5 版更改: legacy 參數只寫出 .pyc 文件,而不是 .pyo 文件,無論 optimize 的值是什么。
