记一次艰难的部署PI项目的过程
项目地址
https://github.com/bitpeach/Protocol-Informatics/tree/master?tab=readme-ov-file
项目的具体介绍以及涉及到的论文原文都可以在该地址下载。本文主要讲一讲对PI-0.02-beta进行部署时,配置相关依赖的具体步骤及期间遇到问题的解决方案。叙述未必详细,但尽可能还原自己当时配置的情形。
详细步骤
运行环境
Ubuntu22.04,conda的虚拟环境使用的python版本为2.7.18。
依赖模块的安装
在终端里按照仓库里的用法说明输入对应的命令运行main.py文件,根据提示安装缺少的包,在国内用清华源会快一点。其中nltk包使用3.3版本,这是尝试了好几个版本后才发现可以安装成功的。当前环境下pip过的所有包及其版本如下图所示:
align包的编译生成
好了,好不容易把缺少的依赖装的七七八八了,接下来是重头戏:快把我折腾崩溃的import align。
python自己也有一个align模块,但由于旧版本(1.0.0)的项目文件夹下有名为align.so和align.pyx的两个文件,猜测这里用到的显然不是python库里的align模块,而是项目作者自己用其他语言编写的模块,需要编译后才能被python程序import使用。而新版本,即2.0.0版本缺少了align.so这个文件,导致程序无法使用align模块内中的方法。
尝试第一次
好了,问题找到了,只要有这个.so文件是不是问题就解决了,于是我把1.0.0版本项目下的那个文件搬过去,结果却不行,原因是编译的平台不同,1.0.0版本下的align.so文件应该是在Windows环境下编译生成的,而我自己用的是linux环境。好了,这条移花接木的路断了。
尝试第二次
好了那就去编译呗,目的就是要通过.pyx文件得到.so文件呗。于是根据makefile文件的提示尝试运行了一下python setup.py install,结果说找不到align.c文件,此时心态快崩了,整了半天结果你文件没给全,合着白忙活了。
尝试第三次
就在将弃未弃之时决定再最后挣扎一下,打开了setup.py瞅瞅里面具体长得啥样,看不太懂,但找到一个关键部分:异常捕获里有一个变量pyrex_suffix,对它的赋值有两个分支,一个赋值为".c",一个赋值为".pyx",猜测这个变量如果为".pyx"是不是就不用align.c文件而只要有align.pyx就行了。那么关键点就在这个异常捕获当中,这段代码首先尝试导入Pyrex.Distutils模块,如果导入失败,则将pyrex_suffix设置为".c"。如果导入成功,则不执行except代码块,而是执行else代码块中的内容。
from distutils.