Python項(xiàng)目打包成二進(jìn)制的方法
python本身是一種腳本語(yǔ)音,發(fā)布的話(huà),直接發(fā)布源代碼就可以了,但是,可能有些公司并不想發(fā)布源代碼,那么,就涉及到打包了,網(wǎng)上有很的打包教程,其實(shí)我也沒(méi)有認(rèn)真去研究,因?yàn)槲抑幌牒?jiǎn)單點(diǎn),所以,我打算直接編譯成pyc二進(jìn)制文件來(lái)發(fā)布,就可以了。
問(wèn)題編譯成二進(jìn)制文件(*.pyc)之后,文件名都變了,模塊之間怎么引用?網(wǎng)上的例子,大都是對(duì)單個(gè)文件編譯的介紹,對(duì)整個(gè)目錄編譯的話(huà),也都是輸出到相應(yīng)的文件夾下,需要單獨(dú)抽取出來(lái),發(fā)布。
解決問(wèn)題一般編譯之后的文件命名為:比如我的源文件為test.py,編譯后輸出到__pycache__文件夾下test.cpython-37.pyc,要保持模塊引用不改變,那么必須在編譯之后重命名為test.pyc文件,批注:37是因?yàn)槲沂褂玫膒ython版本為3.7.4所以含有37,其他版本要做相應(yīng)的調(diào)整。需要按照原來(lái)的項(xiàng)目目錄結(jié)構(gòu)輸出pyc文件才能保證模塊之間調(diào)用沒(méi)有問(wèn)題。
編碼實(shí)現(xiàn)import osimport shutilimport compileallfrom pathlib import Pathversions = '.cpython-37'pycache = '__pycache__'build_dir = 'build'root = os.getcwd()print('正在編譯文件...請(qǐng)等待...')compileall.compile_dir(root) # 編譯build = Path(root,build_dir)if build.exists(): print('正在移除build目錄...請(qǐng)等待...') shutil.rmtree(build)print('正在復(fù)制文件...請(qǐng)等待...')shutil.copytree(root,build) # 復(fù)制文件到build目錄for root, dirs, files in os.walk(build): # 開(kāi)始遍歷文件# root 表示當(dāng)前正在訪問(wèn)的文件夾路徑# dirs 表示該文件夾下的子目錄名list# files 表示該文件夾下的文件list# 遍歷文件for f in files: src = os.path.join(root, f) if f.endswith('.py'):os.remove(src) elif f.endswith('.pyc'):upper_dir = root.replace(pycache,'')dst = os.path.join(upper_dir,f.replace(versions,''))shutil.copy(src,dst)for root, dirs, files in os.walk(build): # 移除緩存文件夾 print('正在移除緩存文件...請(qǐng)等待...') if root.endswith(pycache):shutil.rmtree(root)print('打包完成...請(qǐng)查看目錄:'+str(build))
注意文件中版本號(hào)的調(diào)整,基本上是通用的,所有的python項(xiàng)目都可以用拿來(lái)就用。代碼很簡(jiǎn)單,但是很實(shí)用。
牛人之所以是牛人,是因?yàn)槟悻F(xiàn)在在踩的坑,他曾經(jīng)都已經(jīng)踩過(guò)了。
以上就是Python項(xiàng)目打包成二進(jìn)制的方法的詳細(xì)內(nèi)容,更多關(guān)于Python項(xiàng)目打包成二進(jìn)制的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法2. python中pandas.read_csv()函數(shù)的深入講解3. python爬蟲(chóng)利用代理池更換IP的方法步驟4. JS算法題解旋轉(zhuǎn)數(shù)組方法示例5. SpringBoot集成SSM、Dubbo、Redis、JSP的案例小結(jié)及思路講解6. Python語(yǔ)言規(guī)范之Pylint的詳細(xì)用法7. springboot用controller跳轉(zhuǎn)html頁(yè)面的實(shí)現(xiàn)8. VMware如何進(jìn)入BIOS方法9. JavaScript forEach中return失效問(wèn)題解決方案10. PHP設(shè)計(jì)模式之迭代器模式Iterator實(shí)例分析【對(duì)象行為型】
