2024-04-28 23:32:43 发布
网友
我编写了一个python脚本,它使用numpy、multiprocessing、tqdm和feq其他python库。另外,我运行的软件包(例如samtools、bwa、GATK)都是在linux中安装所必需的(apt-get-install)。在
我想以某种方式包装所有这些依赖关系,使最终安装尽可能的用户友好和稳定。在
在这里,python似乎不包括在python包中。在
也许Docker或创建一个包含所有这些依赖关系的conda环境是可能的,但我并没有真正了解如何管理这些。在
我不会把软件安装到某台计算机/服务器上,因为它可能会破坏运行在该系统上的其他软件。(尽管不能省略使用pip安装软件包)。相反,我将创建一个deb包并设置软件必须安装的依赖项,以指导用户完成安装。在
pip
1。创建deb目录结构 目录deb包含包的最终脚本/二进制文件。source有你的python代码。在
deb
source
$ 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。在
/deb/DEBIAN/control:DEBIAN包管理器的控制文件。在
/deb/DEBIAN/preinst:可以在其中安装python包的文件。它在安装hello-world.py之前运行。同样,确保你不只是(重新)安装/更新一个库。它可能会导致其他软件的不兼容问题。在
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
dpkg -i hello-world.deb # for installation dpkg -r hello-world # for removal
一个很好的特性是您不必担心软件的版本,因为它是在control文件中完成的。如果您有兴趣阅读更多内容,Debian的tutorial相当不错。在
control
第三方软件在Linux中使用的最具包容性的方法是提供一个脚本(或者一个运行脚本的GUI前端)来运行所有必要的命令。在
更可取的是,您可以以特定发行版的包格式发送。这将确保系统的包管理器持续跟踪您的依赖项,但代价是仅限于特定的发行版(或一系列相关发行版),并且必须确保您的依赖项也以相同的格式提供给用户。在
有些发行版提供了其他依赖于系统上存在的子系统的方法;例如,通过同名子系统运行的Canonical offers a "snap" distribution format。这里的优点和缺点来自这样一个事实,即这样的环境将您的程序与系统的其他部分隔离开来:在子系统支持的每个地方运行,而不关心包冲突,代价是必须潜在地捆绑所有依赖项(从而失去对它们的免费维护)以及对程序的严格限制可以使用系统中的其他地方并与之交互。在
我认为一个好的起点应该是一个Dockerfile,从一个Ubuntu映像开始,然后安装所需的依赖项(samtools,bwa)以及python包(放在要求.txt)在
pip freeze > requirements.txt
创建一个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 built tag repository/imagename .
docker run -dti name test repository/imagename
docker attach test
如果要添加新工具,只需将它们添加到Dockerfile中,如果要添加python包,只需展开要求.txt文件。
如果您有一个python脚本可以执行某些操作,并且需要将其包含到Docker容器中,只需将它与Dockerfile和要求.txt并更新Dockerfile(为了有一个启动python脚本的容器),在Dockerfile中,最后一行将是CMD [ "python", "./my_script.py" ]
CMD [ "python", "./my_script.py" ]
我不会把软件安装到某台计算机/服务器上,因为它可能会破坏运行在该系统上的其他软件。(尽管不能省略使用
pip
安装软件包)。相反,我将创建一个deb包并设置软件必须安装的依赖项,以指导用户完成安装。在1。创建deb目录结构
目录
deb
包含包的最终脚本/二进制文件。source
有你的python代码。在2。添加文件
下面我添加了每个文件的内容。你应该能够根据你的需要来实施它。在
/Makefile:此文件负责生成源和deb。在
^{pr2}$/deb/DEBIAN/control:DEBIAN包管理器的控制文件。在
^{3}$/deb/DEBIAN/preinst:可以在其中安装python包的文件。它在安装
hello-world.py
之前运行。同样,确保你不只是(重新)安装/更新一个库。它可能会导致其他软件的不兼容问题。在/source/Makefile:我用来测试此设置的文件。在
3。安装和拆卸 安装非常简单,只需使用
dpkg
。一个很好的特性是您不必担心软件的版本,因为它是在
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)例如:
构建docker映像
docker built tag repository/imagename .
(DOT是当前目录)docker run -dti name test repository/imagename
docker attach test
如果要添加新工具,只需将它们添加到Dockerfile中,如果要添加python包,只需展开要求.txt文件。
如果您有一个python脚本可以执行某些操作,并且需要将其包含到Docker容器中,只需将它与Dockerfile和要求.txt并更新Dockerfile(为了有一个启动python脚本的容器),在Dockerfile中,最后一行将是
CMD [ "python", "./my_script.py" ]
相关问题 更多 >
编程相关推荐