风险函数梳理工具
在日常的软件开发工作中,代码的安全性和质量至关重要。然而,面对庞大的代码库,手动查找潜在的风险函数不仅耗时,而且容易出错。特别是在团队协作中,代码审查和重构工作往往占据了大量宝贵的时间,使得开发者们无法专注于更具创造性的任务。那么,有没有办法让我们用更少的时间完成这些繁琐的工作,从而有更多时间去“摸鱼”呢?
为此,我们开发了一款风险函数梳理工具,旨在帮助开发者快速定位并梳理代码中使用的不安全函数。这款工具的核心功能包括:
- 自动化搜索:工具能够在指定的文件夹及子文件夹内自动搜索指定的不安全函数。
- 智能识别:通过精确的正则表达式匹配,工具能够准确地识别函数定义,并记录下这些函数的详细信息,包括所在的文件、行号以及整个函数的范围。
- 多线程处理:利用多线程技术加速搜索过程,显著提高了处理大量文件的速度。
- 结果可视化:搜索结果将以易于阅读的表格形式展示,方便开发者一目了然地查看哪些地方使用了不安全的函数。
- 灵活配置:支持自定义排除特定类型的文件(如文档、图片等),以减少不必要的搜索范围,提高效率。
1、使用说明
1.1 运行方式
自己运行代码,根据理解可以增加功能
- 在终端或命令提示符中执行以下命令来安装所有依赖项
pip install -r requirements.txt
- 导航到包含 app.py 文件的目录
- 在终端或命令行界面中,运行以下命令来启动 Streamlit 应用
streamlit run app.py
- 或者直接在pycharm中执行
main.py
文件
直接运行exe文件
- 在dist文件夹下存在main.exe文件:
- 直接点击即可打开应用;
- 建议在终端或命令行界面中,以
main.exe
运行(可以查看执行过程)
1.2 使用示例
-
执行程序
-
选择风险函数梳理初级处理工具
-
选择待处理路径:可以输入多个绝对路径,用英文逗号分隔即可
-
选择待搜索函数:可以输入多个函数名称,用英文逗号分隔即可
-
选择要排除的文件后缀名:可以输入多个后缀名,用英文逗号分隔即可
-
选择保存类型:
- Excel:保存为xlsx文件
- CSV:保存为csv文件
- JSON:保存为json文件
-
点击开始处理按钮:
- 执行完会显示下载文件:点击下载按钮可以直接下载到本地
- 数据预览:显示前10行查询结果,并显示查询结果保存的位置
2、生成可执行文件
- 其中输入的是Image.open(basic_uploaded_file)类型的图像,如果使用OpenCV进行处理注意转换,并且输出要转换回原来的类型
- 利用pyinstaller打包streamlit移植到其他电脑上使用
2.1 生成已安装库文件
确保你的环境中已经安装了所有必要的库:
确保你在开发环境中安装了所有应用程序运行所需的库,包括 Streamlit 和任何其他第三方库。
通过 pip freeze > requirements.txt
命令生成一个包含所有已安装库及其版本号的文件。
2.2 安装pyinstaller
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
2.3 打包
打包 Python 应用程序
- PyInstaller 会自动处理大多数依赖关系,并将它们打包到最终的可执行文件中。
- –onefile 选项表示将所有依赖项合并到一个单一的可执行文件中;
- –windowed 选项则表示生成的应用程序将在没有控制台窗口的情况下运行(仅适用于 Windows)。
pyinstaller --onefile --windowed main.py
pyinstaller打包streamlit预处理
- PyInstaller 虽然会自动处理大多数依赖关系,但是streamlit库一般无法正确处理,可以使用下面的办法解决:
- 创建hook文件,放在hooks文件夹下(命名以hook开头)
from PyInstaller.utils.hooks import copy_metadata
datas = copy_metadata("streamlit")
- 在项目根目录下创建main.py
import os
import sys
import streamlit.web.cli as stcli
def resolve_path(path):
resolved_path = os.path.abspath(os.path.join(os.getcwd(), path))
print(resolved_path)
return resolved_path
if __name__ == "__main__":
sys.argv = [
"streamlit",
"run",
# 填写streamlit启动页面(本文把启动文件app.py放在main.py同目录)
resolve_path("app.py"),
"--global.developmentMode=false",
]
sys.exit(stcli.main())
进行第一次打包
--additional-hooks-dir=
:指定一个目录,该目录中包含自定义的钩子文件(本文把钩子文件建立在hooks文件夹下)。这些钩子文件可以帮助 PyInstaller 更准确地处理某些库或模块。- 打包完成后会生成main.spec、dist、build文件
pyinstaller --onefile --additional-hooks-dir=./hooks main.py --clean
-
第一次打包的执行文件可能依旧不会成功,因为我们没有指定
streamlit
库路径,我们可以在main.spec
文件里进行编辑-
datas=[('venv/lib/python3.8/site-packages','.')]
:注意venv/lib/python3.8/site-packages
是Virtualenv
方式建立的python环境中安装包所在目录;如果你使用的是Conda
创建环境,你需要找到所建环境的位置。 -
找到某个库所建环境的位置:
import os import streamlit import sys # 获取 streamlit 模块的文件位置 streamlit_path = os.path.dirname(streamlit.__file__) print(f"Streamlit is located at: {streamlit_path}")
-
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
# 第一个参数:config:这是指定要包含的源文件的路径。在这个例子中,config 是一个配置文件所在文件夹,位于与 main.py 同级的目录下。
# 第二个参数:'config':这是指定目标路径。在这里,'config' 表示当前目录的config文件夹。这意味着在打包后的 EXE 文件运行时,config应该被放置在 EXE 文件所在的目录下。
# venv/lib/python3.8/site-packages':注意一定要填写你的streamlit安装位置的上级目录
# 如果你的程序只有一个启动文件`gui.py`,没有配置文件夹或类似services文件夹,只需要datas=[('venv/lib/python3.8/site-packages','.')],
datas=[('config','config'),('pages','pages'),('services','services'),('venv/lib/python3.8/site-packages','.')],
hiddenimports=[],
# 指定 Hook 文件所在的目录
hookspath=['./hooks'],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
进行第二次打包
- 先将之前生成的dist和build文件删掉
pyinstaller main.spec --clean
# TODO 切记要在目标环境ji
D:\anaconda\install\envs\gongju\Scripts\pyinstaller.exe main.spec --clean
- 注意:如果你的程序只有一个启动文件
app.py
,没有配置文件夹或类似services文件夹,那么到这里应该就可以正常运行;否则:- 类似services文件夹(存放函数)在打包配置
main.spec
里指定即可; - pages(存放streamlit页面)文件夹需要复制到生成的dist里
- config配置文件夹建议复制到生成的dist里,因为这样配置改变时才会生效
- 启动文件
app.py
复制到生成的dist里
- 类似services文件夹(存放函数)在打包配置
优化内存
- 此时虽然可以正常运行,但是打包后的执行文件很大,如何优化打包内存?
- 编辑
main.spec
的 pathex 参数:该参数用于指定可执行文件运行时的路径列表。这个列表中的路径会被用来寻找与应用程序相关的文件。pathex 参数对最终可执行文件的大小有显著影响,因为它决定了哪些文件和目录会被包含在最终的打包结果中 - 设置pathex=[‘.’]:当 pathex=[‘.’] 时,PyInstaller 会明确地告诉打包工具只在当前工作目录下查找所需的文件和依赖项。这样可以减少不必要的文件被包含进来,从而减小最终可执行文件的大小。
- 编辑
3、源码下载路径
风险函数梳理工具