记一次艰难的部署PI(Protocol Informatics)项目的过程

项目地址

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

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史迪仔的粉红泡泡空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值