记一次艰难的部署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.core import setup
from distutils.extension import Extension
import sys, os.path
# Use Pyrex
#import distutils.sysconfig
#if distutils.sysconfig.get_config_var('CC').startswith("gcc"):
# pyrex_compile_options = []
#else:
pyrex_compile_options = []
if sys.platform == "win32" and len(sys.argv) < 2:
sys.argv[1:] = ["bdist_wininst"]
# Compiling Pyrex modules to .c and .so
try:
import Pyrex.Distutils
except ImportError:
distutils_extras = {}
pyrex_suffix = ".c"
else:
class pyrex_build_ext(Pyrex.Distutils.build_ext):
def pyrex_compile(self, source):
from Pyrex.Compiler.Main import CompilationOptions, default_options
options = CompilationOptions(default_options)
result = Pyrex.Compiler.Main.compile(source, options)
if result.num_errors <> 0:
sys.exit(1)
distutils_extras = {
"cmdclass": {
'build_ext': pyrex_build_ext}}
pyrex_suffix = ".pyx"
def PIExtension(module_name):
path = module_name.replace('.', '/')
return Extension(module_name, [path + pyrex_suffix],
extra_compile_args = pyrex_compile_options)
setup(
name = "PI",
version = "0.01",
url = "http://www.baselineresearch.net/PI",
author_email = "mbeddoe@baselineresearch.net",
description = "Protocol analysis toolkit using bioinformatics algorithms",
packages = ["PI", "consolesize"],
ext_modules=[
PIExtension("PI.align")],**distutils_extras
)
因此根据代码逻辑和我们的需求,我们还需要安装一个依赖,也是去pypi.org搜Pyrex,pip完之后再次运行python setup.py install。好了终于生成align.c文件了。
结果又报错:
我…
尝试第四次
其实这个错误比较好解决,往上追溯报错信息发现上一个步骤是gcc对align.c进行编译,在编译的过程中缺少了头文件,我的方法是去numpy文件夹下把编译所需要用到的.h文件全都搬过来。当然应该也可以更改gcc的编译命令,用-I
把numpy的文件夹路径添加为头文件搜索路径。
安装graphviz
好了依赖整完终于可以运行程序了,结果帅不过3秒…报错:OSError: [Errno 2] “dot” not found in path.原因是缺少Graphviz,这是一个将dot代码转化成可视化图形的工具,之前用netzob做状态机的时候遇见过。解决方案是sudo apt install graphviz
。