Python打包包含静态文件处理方法使用场景已经搭建了一个PyPI私有库,上传的公共库包含静态文件。如有必要,使用sql静态文件初始化数据库。打包python包给别人用,但是项目中包含静态文件,比如html。解决静态文件读取问题的解决步骤解决静态文件打包问题环境Python3.8PyCharm2020demo项目为例创建项目显示静态文件读取问题的步骤SolutionstodisplaystaticfilepackagingproblemSolutions1.Createaproject创建一个demo工程(text-setup),目录如下test-setupdemo\_\_init\_\_.pydemo.pydemo.txt/demo/demo.txt,文本来自demo.txt./demo/demo.pyimportosdefget_txt():"""使用原来的openio方式打开"""withopen('demo.txt','r',encoding='utf-8')asf:returnf.read()defget_demo_txt():"""修改获取路径方式,使用io打开"""current_dir=os.path.dirname(__file__)file_path=os.path.join(current_dir,'demo.txt')withopen(file_path,'r',encoding='utf-8')asf:returnf.read()if__name__=="__main__":"""课堂测试,无异常"""print("get_demo_txt():",get_demo_txt())#get_demo_txt():文字来自demo.txt。print("get_txt():",get_txt())#get_txt():文本来自demo.txt。在当前路径执行demo.py文件没有异常(使用PyCharm直接右键运行)2.显示静态文件读取问题demo.pyfile)会报错$pythondemo/demo.pyget_demo_txt():Thetextisfromdemo.txt.Traceback(mostrecentcalllast):File"demo/demo.py",line21,inprint("get_txt():",get_txt())#get_txt():文本来自demo.txt。文件“demo/demo.py”,第6行,在get_txt中,open('demo.txt','r',encoding='utf-8')asf:FileNotFoundError:[Errno2]Nosuchfileordirectory:'demo.txt'很明显,直接使用相对路径读取静态文件的方法会报错。使用os.path.dirname(\_\_file\_\_)获取当前python文件路径拼接不会报错。3.解决方案使用os。path.dirname(\_\_file\_\_)获取当前python文件路径,然后删除静态文件路径demo中的get_txt()方法,进行下面的打包demo4.显示静态文件打包问题,创建打包配置文件/setup.pyfromsetuptoolsimportfind_packages,setupsetup(name='demo',version='1.0.0',packages=find_packages(),zip_sage=False,)执行打包命令$pythonsetup.pysdist打开Packageinformation文件,内容如下-info/dependency_links.txtdemo从.egg-info/top_level.txt可以看出资源文件中没有demo.txt。你可以实际尝试一下。其他项目引用该文件执行获取文件,会报错FileNotFoundError5。解决方法是修改打包配置文件/setup.pyfromsetuptoolsimportfind_packages,setupsetup(name='demo',version='1.0.0',packages=find_packages(),zip_sage=False,include_package_data=True,#包包含静态文件标识)添加配置文件/MANIFEST.inincludedemo/demo.txt最终文件目录test-setupdemo\_\_init\_\_.pydemo.pydemo.txtsetup.pyMANIFEST.in再次执行打包命令$pythonsetup.pysdist打开打包信息文件,内容如下/demo.egg-info/SOURCES.txtMANIFEST.insetup.pydemo/__init__.pydemo/demo.pydemo/demo.txtdemo.egg-info/PKG-INFOdemo.egg-info/SOURCES.txtdemo.egg-info/dependency_links.txtdemo.egg-info/top_level.txt,可以看到打包信息里已经有demo.txt,引用这个包不会报错参考:CreatingaSourceDistributionFlaskdocs-MaketheProjectInstallable