应用于蛋白-小分子动态对接的等变几何扩散模型-DynamicBind 评测

本文主要是介绍应用于蛋白-小分子动态对接的等变几何扩散模型-DynamicBind 评测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DynamicBind是一个用于蛋白和小分子复合体系构象采样及其打分的等变几何扩散网络。

DynamicBind利用等变几何扩散网络平滑蛋白-小分子复合结构的势能面,以便促进蛋白-小分复合物构象的转化,从而实现高效的采样。DynamicBind 可以从未结合的蛋白质结构中准确地生成配体结合的特异性构象,而无需带配体蛋白结构或大量MD采样,俗称柔性对接。

与柔性对接不同,DynamicBind对口袋构象的处理可以是侧脸的旋转,loop的摆动,二级结构的变化,口袋构象变化更大。

一、模型简介

DynamicBind是上海交通大学郑双佳研究员和星药科技Lu wei等人于2024年2月5日发表在nature communication上的工作,题目为:DynamicBind: predicting ligand-specific protein-ligand complex structure with a deep equivariant generative model。

关于蛋白和小分子的结合力/活性预测,一直以来,有很多的文章不断地发表,是药物设计深度学习的重点研究方向之一。但是这些方法使用的蛋白表示有序列或三级结构,分子的表示一般是smiles。但是在蛋白和小分子的结合力时,往往只有一个结果,而没有给出蛋白和小分子的结合位置,以及小分子的结合pose。

当然,也有其他的深度学习模型,像docking一样,基于输入的蛋白三级结构和小分子的smiles,生成小分子的结合pose,例如:diffdock, tankbind等;但是这些模型往往又是仅给出结合位置和分子的pose,没有给出打分。

另一方面,这些模型使用的蛋白结构式静态的,在对接过程中蛋白也是刚性的。不能处理诱导性口袋,或者小分子导致的口袋的侧链旋转。(注:tankbind就是星药科技开发的模型)

DynamicBind很好的将这两个问题结合起来,一起解决了,实现了蛋白质和小分子的动态对接,以及结合构象采样。

DynamicBind 可以从未结合的蛋白质结构中准确地生成配体结合的特异性构象(注意:是小分子结合时的蛋白特异性构象,即,不同的小分子有不同的构象),而无需带配体蛋白结构或大量MD采样,而且还可以进行隐蔽口袋的对接。

DynamicBind甚至可以实现小分子引导的DFG-in到DFG-out的转变。从这一个角度来看,是第一次AIDD在功能上超越了传统CADD的柔性对接的能力范畴,实现了更高程度的整合(端到端)。

如作者展示的下图,在动态对接过程中,甚至可以模拟DFG-out到DFG-in的变化。(gif 无法播放。。。)

二、模型结构

DynamicBind预测蛋白-小分子的复合结构,同时预测蛋白可能出现的构象变化。

输入的蛋白结构为pdb结构,可以是AlphaFold的预测结果。输入的小分子是smiles或者是sdf格式。

DynamicBind将rdkit生成的小分子构象随机的放置在蛋白周围,然后使用逐渐变小的时间步长,模型逐渐平移和旋转小分子,同时调整其内扭转角。 在仅改变配体构象的最初五个步骤之后,DynamicBind模型随后在剩余步骤中同时平移和旋转蛋白质残基,同时修改氨基酸侧链扭转角。 

在每一步的迭代中,小分子和蛋白的特征(侧链扭转角,ca原子坐标,小分子的键,原子特征等)都会输入到SE3等变模块,然后经过读出机制更新。如下图:

与基于扩散模型训练中采用的添加噪音方法不同,传统方法通过使用不同幅度的高斯噪声扰乱真实状态来生成诱饵,DynamicBind采用类似变形的变换来产生蛋白质诱饵。 

DynamicBind的类变形转化生成的诱饵通常满足基本的化学约束,并且可以使模型能够专注于学习生物物理相关的状态变化事件。在此过程中,天然构象逐渐转变为 AlphaFold 预测的构象。而传统的高斯噪声扰乱只能让模型学习到符合化学规则的状态(添加噪音前的状态)。

在采样效率方面,当蛋白质与两种不同的配体结合时,模型可以预测不同的holo构象,模型生成的是特异性结合构象。 DynamicBind模型可以在 20 步内预测结合状态下的蛋白质构象,而需要数百万步的全原子 MD 模拟才能找到相同的蛋白结合状态。

三、模型性能

3.1 小分子pose的准确性和蛋白口袋构象

训练、验证和测试集,使用的是pdbbind数据集,按照时间进行划分。使用的测试集是2019年以来的300个结构,其中包含了53个多肽。同时,作者使用策展的Major Drug Target 数据集中2020 以后的结果,进一步扩展测试集,里面包含了激酶,核酸受体,GPCR等家族的蛋白。

如下图,DynamicBind预测的小分子pose在不同的RMSD阈值下,比DiffDock, Glid,TankBind等其他AI模型和传统基于力场的glide等对接工具,均展现出更高的达成比例。

33%的pdbbind测试集和39%的Major Drug Target测试集中小分子的RMSD小于2A,如下图。

同样,上图c中,深色展示了在RMSD小于2A且clash score <0.35条件下,测试集的达成比例。浅色的是RMSD小于5A且clash score <0.3条件下,测试集的达成比例。

显然,DynamicBind具有更好的结果,意味着,DynamicBind生成的小分子pose不仅仅更接近于晶体结构(RMSD更小),而且,与蛋白口袋的冲突更少。也意味着,DynamicBind能够处理蛋白口袋的构象变化,生成更接近holo状态下的构象。

如下图,即使在初始口袋与晶体结构的RMSD很大的情况下,DynamicBind预测的口袋RMSD要显著小于AlphaFold 预测的结果。

DynamicBind预测的contact-LDDT (cLDDT) 的打分与小分子的RMSD之间相关关系较好。在最优构象方面,随着采样的数量增加,成功率增加,但是相同成功率条件下DynamicBind所需的采样构象相对更少。

这些结果都说明DynamicBind有能力预测口袋相应的构象变化,生成的口袋构象更接近晶体结构。

在SI信息中,即使在与训练集中小分子相似度小于30%,60%,90%的测试集中,DynamicBind 预测的小分子在不同RMSD阈值下的达成比例,也优于其他AI模型,同时优于包括glide等基于力场的传统docking方法。(即,DynamicBind有能力预测没有见过的小分子。)

但是在没有出现在训练集中的蛋白(序列相似度小于30%,60%,90%),不同小分子RMSD阈值下的达成率,DynamicBind 的结果不如传统的基于力场的glide等docking工具结果,如下图。

意味着,DynamicBind无法应用于没有出现过新的靶点,或者不如传统的基于力场的方法好。当然,其他AI方法的结果类似,例如Diffdock。

说明,DynamicBind不能预测没有见过的蛋白。

3.2 口袋的构象变化

传统的对接方法,需要先确定好口袋的构象,要确定口袋正确的构象。当时,这一步很难,因为不同的小分子,往往会诱导口袋形成不同的构象,因此往往需要重复按照小分子去研究口袋的对接grid。另一种方案是使用ensemble docking方法。

但是,DynamicBind可以自动的根据小分子调整口袋的构象,DynamicBind可以输入AlphaFold预测的结果,而不需要先确定口袋的正确的构象,也意味着,对于不同的分子,只需要输入一个口袋构象即可。这一点,确实是传统CADD工具没有实现的。

作为例子,作者利用激酶的DFG-in和DFG-out进行举例,6UBW和7U3S,都是c-MET。

这两个例子的AlphaFold预测的口袋与小分子结合后的口袋RMSD差距都很大,分别为9.44 Å和6.02 Å。

且这两个体系均未出现在模型的训练集中。但是DynamicBind预测的小分子RMSD分别仅为0.49 Å和0.51 Å,说明预测的小分子pose基本正确。而DynamicBind预测的口袋RMSD分别仅为1.97 Å和1.19 Å说明,口袋构象预测非常准了。

并且在结构可视化分析中,两个小分子分别诱导的DFG-in和DFG-out也能被DynamicBind预测出来。

关于其他测试集中DFG-in和DFG-out体系的79个PDB结构,DynamicBind预测的口袋RMSD要明显小于AlphaFold预测的口袋RMSD。且口袋的RMSD比AlphaFold预测要大部分都有提升0~2Å(这种提升就不明显),有的甚至达到了8Å(这就属于显著提升)。

在测试集中,作者展示更多不同口袋构象变化的例子,从侧链到loop,到二结构的变化,如下图,白色为AlphaFold预测结构作为DynamicBind的输入,绿色为DynamicBind预测的结合构象。

晶体结构中的小分子为黄色,DynamicBind预测的小分子pose为蓝色。

图中,负的Δpocket RMSD意味着:相较于AlphaFold预测结构,DynamicBind预测口袋构象更接近晶体结构。

负的Δclash意味着,在预测的复合结构中,DynamicBind预测结果发生碰撞的更少。

这些结果说明,DynamicBind可以预测复合体中口袋构象的各种层次变化,即包括了侧链,也包括loop,也包括二级结构,涉及ps到毫秒不同时间尺度的结构变化。

3.3 隐蔽性口袋动态对接

DynamicBind对隐蔽性口袋的动态对接,作者使用的体系是SET domain-containing protein 2 (SETD2) 体系,其隐蔽性口袋的诱发小分子为EZM0414。

DynamicBind在训练时,有使用到SETD2同源家族,但是没有EZM0414的隐蔽性口袋,因为在2019年前,EZM0414的晶体结构还没有解出。

如下图C,白色是AlphaFold预测结构,直接与EZM0414发生冲突。图e为DynamicBind预测的结果,图f将预测结果与晶体结构进行叠合。

从结果来看,DynamicBind确实实现了隐蔽性口袋的动态对接,不仅仅是成功的放置了小分子,而且找到了较为合适的口袋构象(EZM0414小分子的RMSD为1.4Å,对应的口袋的RMSD 为2.16 Å)。

3.4 虚拟筛选能力

DynamicBind也增加了预测小分子和口袋的结合能力的模块。作者使用含有2616化合物-蛋白对的测试集。结果显示,DynamicBind的ROC有0.68,要好于其他AI模型的结果。

以,murD为例,预测的复合物体系构象,能比AlphaFold预测结果的直接叠合更合理。如下图。

四、DynamicBind评测

4.1 环境安装

复制项目代码

git clone https://github.com/luwei0917/DynamicBind.git

创建conda环境

conda env create -f environment.yml

安装Relax环境,用于结构弛豫。

conda create --name Relax python=3.8
source activate Relax
conda install -c conda-forge openmm pdbfixer libstdcxx-ng openmmforcefields openff-toolkit ambertools=22 compilers biopython

下载作者预训练好的checkpoint DynamicBind: Predicting ligand-specific protein-ligand complex structure with a deep equivariant generative model

解压在./目录即可。

4.2 案例测试-ABL1

这里测试的ABL1的uniprot ID 为 P00520 。ABL1有多个结构,抑制剂小分子,其中既有底物位点的,也有变构位点的。我们选择的含有底物抑制剂和变构抑制剂的结构是5MO4,如下图所示。

但是作为输入,使用的是ABL1的另一个晶体结构,1OPK。我们尝试将5MO4的小分子,底物小分子和变构小分子,分别动态对接到1OPK中。然后比较,对接位置和pose,以及口袋的构象变化。接下来中,紫色均为1OPK,蓝色为5MO4。

在变构口袋构象方面,1OPK和5MO4差别不大,RMSD仅有0.234 Å,如下图:

在底物位点口袋构象方面,RMSD差别还是很明显的,RMSD为0.554,特别是DFG位置的两个氨基酸。特别注意的是,由于5MO4在DFG位置,以及QYG位置有氨基酸的确实未解出,所以,将1OPK的口袋更狭窄。将5MO4的小分子对接到1POK中,DynamicBind需要调整DFG位置和QYG位置氨基酸的构象。在结果中,值得特别关注。

需要对接的底物小分子(Nilotinib)smiles为:Cc1ccc(cc1Nc2nccc(n2)c3cccnc3)C(=O)Nc4cc(cc(c4)n5cc(nc5)C)C(F)(F)F,对应2D结构如下图:

需要对接的变构小分子(asciminib)smiles为:c1cc(ccc1NC(=O)c2cc(c(nc2)N3CC[C@H](C3)O)c4ccn[nH]4)OC(F)(F)Cl,对应2D结构如下图:

将变构小分子和底物小分子均写入ligand.csv中,如下图:

将1OPK,删除水,删除原有的配体小分子,然后保存为1OPK.pdb。将1OPK.pdb和ligand.csv放入到新建的./ABL1文件夹中。然后在./ABL1文件夹中新建一个test文件夹,用于保存对接结果。

然后开始使用DynamicBind进行动态对接。执行如下命令:

python run_single_protein_inference.py \ABL1/1OPK.pdb  ABL1/ligand.csv \--savings_per_complex 40 \--samples_per_complex 10 \--inference_steps 20 \--header test \--device 0 \--python ~/anaconda3/envs/DynamicBind/bin/python \--relax_python ~/anaconda3/envs/Relax/bin/python \--results ABL1 -p

程序会先下载一个checkpoint,esm2_t33_650M_UR50D.pt,放在./esm_models/checkpoints/路径中,2.4G。第一次运行需要的下载,时间会有些长。

(注:作者一直在更新这个github项目,每次运行的结果不太一致,上次我是2月10日运行的,当时貌似无需下载)

运行输出:

输出结果保存在./ABL1/test/文件夹中,文件夹目录为:

.
├── affinity_prediction.csv
├── complete_affinity_prediction.csv
├── index0_idx_0
└── index1_idx_1

由于我们是同时对接两个分子,在ligand.csv文件中包含两个smiles,所以./ABL1/test/文件夹中有两个子文件夹(index0_idx_0, index1_idx_1),分别为两个分子的对接结果。index0_idx_0为底物小分子,index1_idx_1为变构小分子。

affinity_prediction.csv 内容如下,包含了每一个分子的 affinity 对接打分。可以看到,底物口袋小分子的结合力预测打分为7.31,而变构小分子的结合力打分为7.71。

name,affinity
idx_0,7.31790423465729
idx_1,7.717542942210824

complete_affinity_prediction.csv是每个小分子的top10的pose打分及其affinity打分,内容如下:

name,rank,lddt,affinity
idx_0,1,0.6664215,7.3399496
idx_0,2,0.6738703,7.2115693
idx_0,3,0.66106814,7.306659
idx_0,4,0.6627517,7.3648543
idx_0,5,0.6653233,7.27874
idx_0,6,0.6571611,7.3133626
idx_0,7,0.6605489,7.357269
idx_0,8,0.6572863,7.3163543
idx_0,9,0.65351903,7.3229322
idx_0,10,0.6513432,7.3701806
idx_1,1,0.6083162,7.9174366
idx_1,2,0.6065392,7.737226
idx_1,3,0.6057902,7.6436768
idx_1,4,0.59344906,7.744586
idx_1,5,0.59857726,7.9449034
idx_1,6,0.5886727,7.6790857
idx_1,7,0.5797746,7.6272044
idx_1,8,0.5735723,7.406704
idx_1,9,0.5832283,7.7300243
idx_1,10,0.5790154,7.726334

在index0_idx_0和index1_idx_1文件夹中,包含了Top10的蛋白构象,以及对应的小分子构象,例如:top1的小分子构象文件和蛋白构象文件分别为:rank1_ligand_lddt0.61_affinity7.92_relaxed.sdfrank1_complex_lddt0.61_affinity7.92_relaxed.pdb。其中,0.61是构象打分,7.92是小分子-口袋结合力打分。

我这里想测试的是DynamicBind预测的小分子pose,以及口袋构象。检查DynamicBind是否能真的动态对接小分子,根据对接的小分子,给出相应更为合理的口袋构象。

4.1.1 底物口袋对接结果

首先,查看底物小分子的结果,这里我们展示DynamicBind认为的最有结果,即rank1。

DynamicBind对接的底物小分子位置和pose与5MO4晶体的非常类似,没有出现分子pose颠倒的情况,只是在三氟苯的一侧,偏差有些大(紫色为DynamicBind预测pose)。

在口袋的构象方面,hinge loop 的构象,DynamicBind预测的结果(紫色)与5MO4(蓝色)和1OPK(绿色)类似。如下图。

DynamicBind预测的P loop和DFG loop,以及c-Helix 有明显的差别。P loop往上走,更加与5MO4容纳小分子的结构类似。但是,c-Helix 更往外飘,以扩大底物口袋,容纳小分子,这一点在比5MO4的口袋更明显。在DFG loop,苯丙氨酸F,更加的向外了,显然这也是为了扩大口袋的需求。

当然,口袋是动态的,扩大口袋不是坏事。关键要看,DynamicBind预测的符合结构的相互作用是否能符合5MO4的结果。

5MO4的相互作用如下。在pymol中,Nilotinib与337蛋氨酸M主链N,305谷氨酸E侧链O,400天冬氨酸D主链的N形成三个H键。

DynamicBind预测的复合物相互作用如下图:Nilotinib与337蛋氨酸M主链N,401苯丙氨酸F侧链O,400天冬氨酸D主链的N形成三个H键。

考虑到,在右侧DFG loop区域的柔性较大,谷氨酸E的H键被苯丙氨酸F的H键取代,是完全可以接受的。再者,都是侧链形成的H键,那就更合理了。

因此,可总结来说,DynamicBind可以很好的放置小分子,同时,根据小分子结构调整口袋的大小,以更适合放置小分子。在蛋白口袋构象方面,DynamicBind做了调整,可以预测出关键的H键相互作用。对于激酶底物的小分子动态对接效果较好,可以算是非常理想了。

4.2.2 变构口袋的对接结果

同样的,DynamicBind预测的变构小分子asciminib,rank1的结果将变构小分子对接到了底物位置,如下图。这也正常,因为这个变构小分子是可以对接到底物位置的。

但是查看了rank1~10的结果,全部都是在底物位点,没有一个在变构位点。因此,可以认为,DynamicBind在ABL1体系的变构分子对接上,对接失败。

降采样数量提升至30, 修改 --samples_per_complexCans参数, 仍然没有找到相应的正确的变构小分子对接位置。30个生成的位置都是在底物位点。

4.2.3 DynamicBind生成(去噪)小分子pose的过程动画

接下来,分别对底物小分子和变构小分子,对对接结果合并,制作动画。分别运行:

python movie_generation.py \ABL1/test/index0_idx_0/ 1+2 \--device 0 \--python ~/anaconda3/envs/DynamicBind/bin/python \--relax_python ~/anaconda3/envs/Relax/bin/python

运行结束后,DynamicBind对接出来的小分子pose,都会生成一个,例如rank1_receptor_reverseprocess_relaxed.pdb和rank1_ligand_reverseprocess_relaxed.pdb文件,对应着是在去噪过程中,DynamicBind如何放置小分子以及实现口袋构象的变化的。基于这两个pdb文件,就可以将里面的states,拆分出来,制作gif。

底物小分子Nilotinib rank1的pose生成过程如下图。在前期,小分子在蛋白的表面寻找结合位点,后面几帧则在调整小分子的pose和蛋白的口袋构象。(gif 无法播放。。。)

变构小分子的对接失败,未能复现晶体中的位置,所以就不展示动画了。

4.3 隐蔽性口袋案例测试-TEM-1

接下来对DynamicBind的隐蔽性口袋动态对接进行测试。使用TEM-1体系,apo结构的PDB ID 为1JWP(蓝色), holo结构的PDB ID 为1PZO(紫色)。如下图:

holo结构中,有两个一样的小分子,2D结构为如下图。对应的SMILES为:c1cc(ccc1CN(Cc2ccc(cc2)Cl)c3n[nH]nn3)Cl 

holo结构中小分子的口袋是一个隐蔽性口袋,是小分子诱导打开的。如下图,在没有小分子情况下,由于侧链以及α螺旋的位置,导致隐蔽性口袋是关闭的,与holo结构中小分子的位置是冲突的。特备是R244,L220,N276,P219距离小分子太近了,已经发生了碰撞。

使用DynamicBind进行动态对接,运行如下命令:

python run_single_protein_inference.py \TEM1/1JWP.pdb  TEM1/ligand.csv \--savings_per_complex 40 \--samples_per_complex 30 \--inference_steps 20 \--header test \--device 0 \--python ~/anaconda3/envs/DynamicBind/bin/python \--relax_python ~/anaconda3/envs/Relax/bin/python \--results TEM1 -p

我们将DynamicBind预测的小分子(cyans)与holo结构的晶体1PZO(紫色)叠合,如下图。小分子位置基本正确,DynamicBind预测的位置更靠里面一些。此外,小分子的pose的朝向也没有问题,氯苯的朝向和位置,与1PZO中的分子基本一致。

在1PZO中,有一个小分子可以与边上的S235的OG形成两个H键,如下图:

DynamicBind预测的结构中,小分子也于S235的OG生成H键,但是数量上仅有一个,如下图

将DynamicBind预测的口袋结构(cyans)和1PZO(holo结构,紫色)和1JWP(apo结构, 绿色)叠合在一起,如下图。红色框标识的部分,DynamicBind预测的结构与1PZO更接近,几乎完全叠合(虽然显示是loop,而1PZO是helix),说明DynamicBind预测到了holo结构的口袋构象。

进一步对比分析,之前提到的R244,L220,N276,三个氨基酸的朝向,如下图。DynamicBind预测的构象(cyans)与holo晶体的构象(紫色)非常接近。

总结来说,从小分子的对接位置,小分子的pose朝向,H键相互作用,口袋的二级结构位置,口袋侧链朝向,五个方面来看,DynamicBind在TEM-1体系中,非常好的实现了隐蔽性口袋的对接,对接结果比较理想。

这篇关于应用于蛋白-小分子动态对接的等变几何扩散模型-DynamicBind 评测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729984

相关文章

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一