使Python脚本与linux包结合,便于为endus安装

2024-04-28 23:32:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个python脚本,它使用numpy、multiprocessing、tqdm和feq其他python库。另外,我运行的软件包(例如samtools、bwa、GATK)都是在linux中安装所必需的(apt-get-install)。在

我想以某种方式包装所有这些依赖关系,使最终安装尽可能的用户友好和稳定。在

在这里,python似乎不包括在python包中。在

也许Docker或创建一个包含所有这些依赖关系的conda环境是可能的,但我并没有真正了解如何管理这些。在


Tags: install用户numpy脚本get关系linux方式
3条回答

我不会把软件安装到某台计算机/服务器上,因为它可能会破坏运行在该系统上的其他软件。(尽管不能省略使用pip安装软件包)。相反,我将创建一个deb包并设置软件必须安装的依赖项,以指导用户完成安装。在

1。创建deb目录结构
目录deb包含包的最终脚本/二进制文件。source有你的python代码。在

$ cd $HOME/path/to/some/directory
$ mkdir -p ./deb/DEBIAN ./source
$ touch ./Makefile ./source/Makefile ./deb/DEBIAN/{control,preinst} ./source/hello-world.py
$ chmod +x ./deb/DEBIAN/preinst

2。添加文件
下面我添加了每个文件的内容。你应该能够根据你的需要来实施它。在

/Makefile:此文件负责生成源和deb。在

^{pr2}$

/deb/DEBIAN/control:DEBIAN包管理器的控制文件。在

^{3}$

/deb/DEBIAN/preinst:可以在其中安装python包的文件。它在安装hello-world.py之前运行。同样,确保你不只是(重新)安装/更新一个库。它可能会导致其他软件的不兼容问题。在

#! /bin/bash
echo "pip install something"

/source/Makefile:我用来测试此设置的文件。在

MYFILE=hello-world.py
all:
        @echo "#!/usr/bin/python\n\
        print('Hello world!')" > $(MYFILE)
        @chmod +x $(MYFILE)
clean:
        @rm $(MYFILE)

3。安装和拆卸 安装非常简单,只需使用dpkg

dpkg -i hello-world.deb # for installation
dpkg -r hello-world     # for removal

一个很好的特性是您不必担心软件的版本,因为它是在control文件中完成的。如果您有兴趣阅读更多内容,Debian的tutorial相当不错。在

第三方软件在Linux中使用的最具包容性的方法是提供一个脚本(或者一个运行脚本的GUI前端)来运行所有必要的命令。在

更可取的是,您可以以特定发行版的包格式发送。这将确保系统的包管理器持续跟踪您的依赖项,但代价是仅限于特定的发行版(或一系列相关发行版),并且必须确保您的依赖项也以相同的格式提供给用户。在

有些发行版提供了其他依赖于系统上存在的子系统的方法;例如,通过同名子系统运行的Canonical offers a "snap" distribution format。这里的优点和缺点来自这样一个事实,即这样的环境将您的程序与系统的其他部分隔离开来:在子系统支持的每个地方运行,而不关心包冲突,代价是必须潜在地捆绑所有依赖项(从而失去对它们的免费维护)以及对程序的严格限制可以使用系统中的其他地方并与之交互。在

我认为一个好的起点应该是一个Dockerfile,从一个Ubuntu映像开始,然后安装所需的依赖项(samtools,bwa)以及python包(放在要求.txt)在

  • pip freeze > requirements.txt以获得所需的python包(numpy、tqdm等)
  • 创建一个Dockerfile(它与要求.txt)例如:

    FROM ubuntu:16.04
    
    RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y python && \
    apt-get install -y wget \
    curl \
    bc \
    unzip \
    less \
    bedtools \
    samtools \
    openjdk-8-jdk \
    tabix \
    bwa\
    python-pip\
    software-properties-common && \
    apt-get -y clean  && \
    apt-get -y autoclean  && \
    apt-get -y autoremove
    
    RUN mkdir -p /usr/src/app
    
    WORKDIR /usr/srv/app
    
    COPY . /usr/srv/app
    
    RUN pip install -r requirements.txt
    
    CMD ["/bin/bash"]
    
  • 构建docker映像docker built tag repository/imagename .(DOT是当前目录)

  • 开始图像docker run -dti name test repository/imagename
  • 进入容器开始工作docker attach test
  • 如您所见,我测试了它,在容器中我有所有想要的工具和包 enter image description here

  • 如果要添加新工具,只需将它们添加到Dockerfile中,如果要添加python包,只需展开要求.txt文件。

  • 如果您有一个python脚本可以执行某些操作,并且需要将其包含到Docker容器中,只需将它与Dockerfile和要求.txt并更新Dockerfile(为了有一个启动python脚本的容器),在Dockerfile中,最后一行将是CMD [ "python", "./my_script.py" ]

相关问题 更多 >