Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用CPack构建debian包以执行setup.py?_Python_Cmake_Packages_Deb_Cpack - Fatal编程技术网

Python 如何使用CPack构建debian包以执行setup.py?

Python 如何使用CPack构建debian包以执行setup.py?,python,cmake,packages,deb,cpack,Python,Cmake,Packages,Deb,Cpack,到目前为止,我的项目只有编译成不同二进制文件的.cpp文件,我成功地配置了CPack,以构建一个合适的debian包 最近,我编写了两个python应用程序,并将它们添加到项目中,以及一些我也想合并到包中的自定义模块 在编写了setup.py脚本之后,我想知道如何将这些文件添加到CPack配置中,当用户使用dpkg-I package.deb在系统上安装包时,setup.pyget将自动执行 我正在努力寻找有关如何配置CPack以安装自定义python应用程序/模块的相关信息。有人试过吗?Ase

到目前为止,我的项目只有编译成不同二进制文件的.cpp文件,我成功地配置了CPack,以构建一个合适的debian包

最近,我编写了两个python应用程序,并将它们添加到项目中,以及一些我也想合并到包中的自定义模块

在编写了
setup.py
脚本之后,我想知道如何将这些文件添加到CPack配置中,当用户使用
dpkg-I package.deb在系统上安装包时,
setup.py
get将自动执行


我正在努力寻找有关如何配置CPack以安装自定义python应用程序/模块的相关信息。有人试过吗?

A
setup.py
文件相当于标准unix源代码发行版的
configure&&make&&make install
舞蹈,因此不适合作为发行版包安装过程的一部分运行。请参阅在
.deb
包中包含Python模块的各种方法。

我找到了一种方法,但并不简单。我会尽力解释这个过程,所以请耐心等待

这种方法的思想是使用postinst和prerm从系统中安装和删除python应用程序。 在定义项目的CMakeLists.txt中,您需要声明CPACK将用于生成.deb包。有些变量需要填入与包本身相关的信息,但名为
CPACK\u DEBIAN\u package\u CONTROL\u EXTRA
的变量非常重要,因为它用于指定postinstprerm的位置,这些是debian打包系统的标准脚本,在安装/删除包时,dpkg会自动执行这些脚本

main
CMakeLists.txt
的某个点上,您应该有如下内容:

add_subdirectory(name_of_python_app)

set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1)

set(CPACK_PACKAGE_NAME "fake-package")
set(CPACK_PACKAGE_VENDOR "ACME")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fake-package - brought to you by ACME")
set(CPACK_PACKAGE_VERSION "1.0.2")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "2")
SET(CPACK_SYSTEM_NAME "i386")

set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ACME Technology")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-12), python2.6, libboost-program-options1.40.0 (>= 1.40.0)")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/name_of_python_app/postinst;${CMAKE_SOURCE_DIR}/name_of_python_app/prerm;")
set(CPACK_SET_DESTDIR "ON")

include(CPack)
这些变量中有一些是可选的,但我用信息填充它们是为了教育目的

现在,让我们来看看脚本:

安装后

#!/bin/sh
# postinst script for fake_python_app

set -e

cd /usr/share/pyshared/fake_package
sudo python setup.py install
#!/bin/sh
# prerm script
#
# Removes all files installed by: ./setup.py install
sudo rm -rf /usr/share/pyshared/fake_package
sudo rm /usr/local/bin/fake_python_app
#!/usr/bin/env python
from distutils.core import setup

setup(name='fake_package',
      version='1.0.5',
      description='Python modules used by fake-package',
      py_modules=['fake_package.fake_module_1', 'fake_package.fake_module_2'],
      scripts=['fake_package/fake_python_app']
     )
prerm

#!/bin/sh
# postinst script for fake_python_app

set -e

cd /usr/share/pyshared/fake_package
sudo python setup.py install
#!/bin/sh
# prerm script
#
# Removes all files installed by: ./setup.py install
sudo rm -rf /usr/share/pyshared/fake_package
sudo rm /usr/local/bin/fake_python_app
#!/usr/bin/env python
from distutils.core import setup

setup(name='fake_package',
      version='1.0.5',
      description='Python modules used by fake-package',
      py_modules=['fake_package.fake_module_1', 'fake_package.fake_module_2'],
      scripts=['fake_package/fake_python_app']
     )
如果您注意到,scriptpostinst进入
/usr/share/pyshared/fake_包
,并执行放置在那里的setup.py,以便在系统上安装应用程序。这个文件是从哪里来的,它是如何在那里结束的?此文件由您创建,并将在系统上安装软件包时复制到该位置。此操作在python应用程序/CMakeLists.txt的
name\u中配置:

install(FILES setup.py
        DESTINATION "/usr/share/pyshared/fake_package"
)

install(FILES __init__.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_python_app
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_module_1.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_module_2.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)
您可能知道,除了我要安装的python应用程序之外,还有我编写的两个自定义python模块也需要安装。下面我将介绍最重要文件的内容:

setup.py

#!/bin/sh
# postinst script for fake_python_app

set -e

cd /usr/share/pyshared/fake_package
sudo python setup.py install
#!/bin/sh
# prerm script
#
# Removes all files installed by: ./setup.py install
sudo rm -rf /usr/share/pyshared/fake_package
sudo rm /usr/local/bin/fake_python_app
#!/usr/bin/env python
from distutils.core import setup

setup(name='fake_package',
      version='1.0.5',
      description='Python modules used by fake-package',
      py_modules=['fake_package.fake_module_1', 'fake_package.fake_module_2'],
      scripts=['fake_package/fake_python_app']
     )
\u init_uuy.py:是一个空文件

伪python应用程序:将安装在/usr/local/bin中的python应用程序


差不多就是这样

谢谢你,我以前读过,但是我不能使用这些工具,我必须使用CMake/CPack。然后你可能需要自己手动实现,但我很确定,如果不使用现有的工具来构建DEB,你的生活会很艰难。我发现CPack非常简单,易于使用。但我需要它做的事情有点复杂。我将在这里发布我的方法,这样你们就可以判断:)我猜讨论的链接断了。你可以使用安装(目录fake\u package DESTINATION/usr/share/pyshared/use\u SOURCE\u PERMISSIONS)吗?我不知道,我猜你必须进行实验。实际上,包应该以文件的形式包含setup.py的结果。