这个问题在这里已有答案:
目标
创建可安装的.deb
文件(或包)。点击后将在Linux机器上安装软件,并在GNOME面板上放置一个图标。从那里启动这个应用程序。
我所提到的
我提到了两个debianizing指南。
第一个有一个无法理解的视频,部分是因为它的重点,部分是因为它已经过时了。(它于2007年上传)
第二个是完全文本。我到第4步,构建包。但是当我这样做时,我得到的输出与指南中给出的输出不匹配。
我需要什么
我有一个简单的python程序。它需要你的年龄,然后如果年龄低于,等于或超过18岁打印出来。这个程序只有一个文件而没有其他依赖项。我想把它变成一个.deb
。
眼镜
-Python 2.7
-Linux Mint
我按照您的指示遵循了确切的目录结构。并用myscript
取代所有cowsandbulls
。构建完成后我得到了Debian。当我安装它然后从终端运行命令cowsandbulls
时,我收到以下错误:
Traceback (most recent call last):
File "/usr/bin/cowsandbulls", line 9, in <module>
load_entry_point('cowsandbulls==1.0', 'gui_scripts', 'cowsandbulls')()
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 337, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2311, in load_entry_point
return ep.load()
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2017, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named cowsandbulls
我刚刚测试了stdeb
(参见https://pypi.python.org/pypi/stdeb)一个Python包,用于将任何其他Python包转换为Debian包。
首先我安装了stdeb:
apt-get install python-stdeb
然后我创建了一个名为myscript.py
的简单脚本,其中包含以下内容:
def main():
print "Hello world, says myscript!"
# wait for input from the user
raw_input()
if __name__ == '__main__':
main()
重要的是,您的目录结构应该是:
somewhere/myscript/
setup.py
myscript/
__init__.py
myscript.py
在setup.py文件中,您执行以下操作:
import os
from setuptools import setup
from nvpy import nvpy
setup(
name = "myscript",
version = "1.0",
author = "Charl P. Botha",
author_email = "[email protected]",
description = "Demo of packaging a Python script as DEB",
license = "BSD",
url = "https://github.com/cpbotha/nvpy",
packages=['myscript'],
entry_points = {
'console_scripts' : ['myscript = myscript.myscript:main']
},
data_files = [
('share/applications/', ['vxlabs-myscript.desktop'])
],
classifiers=[
"License :: OSI Approved :: BSD License",
],
)
console_scripts
指令很重要,它将创建一个名为my_script
的可执行脚本,在安装生成的DEB后,它将在系统范围内可用。如果您的脚本使用tkinter
或wxpython
之类的东西并且具有图形用户界面,则应使用gui_scripts
而不是console_scripts
。
data_files
指令将在/usr/share/applications
中安装一个合适的桌面文件,以便您也可以从桌面环境启动myscript
。 vxlabs-myscript.desktop
看起来像这样:
[Desktop Entry]
Version=1.0
Type=Application
Name=myscript
Comment=Minimal stdeb example
# myscript should wait for user input at the end, else the terminal
# window will disappear immediately.
Exec=myscript
Icon=/usr/share/icons/gnome/48x48/apps/file-manager.png
Categories=Utility;
# desktop should run this in a terminal application
Terminal=true
StartupNotify=true
StartupWMClass=myscript
要构建DEB,请在顶级myscript
中执行以下操作:
python setup.py --command-packages=stdeb.command bdist_deb
这将在deb_dist目录中创建.deb。
在安装了我这样创建的DEB之后,我可以从命令行运行myscript
,我也可以从桌面环境中调用它。
这是一个带有上面示例代码的github repo:https://github.com/cpbotha/stdeb-minimal-example
构建deb包的正确方法是使用dpkg-buildpackage
但有时它有点复杂。相反,你可以使用dpkg -b <folder>
,它将创建你的Debian包。
这些是使用dpkg -b <folder>
创建Debian软件包的基础知识,包含任何二进制文件或任何类型的脚本,无需手动编译即可自动运行(Python,Bash,Pearl,Ruby):
ProgramName-Version/
ProgramName-Version/DEBIAN
ProgramName-Version/DEBIAN/control
ProgramName-Version/usr/
ProgramName-Version/usr/bin/
ProgramName-Version/usr/bin/your_script
放置在/usr/bin/
的脚本直接从终端调用,请注意我没有在脚本中添加扩展名。另外你可以注意到deb软件包的结构一旦安装就会成为程序的结构。因此,如果你的程序只有一个文件就可以遵循这个逻辑,你可以直接把它放在ProgramName-Version/usr/bin/your_script
下,但是如果你有多个文件,你应该将它们放在ProgramName-Version/usr/share/ProgramName/all your files
下,并且只在/usr/bin/
下放置一个文件,它将从/usr/share/ProgramName/
调用你的脚本
chown root:root -R /path/to/ProgramName-Version
chmod 0755 /path/to/the/script
dpkg -b /path/to/the/ProgramName-Version
,你的deb包将被创建! (你也可以添加post / pre inst脚本和你想要的一切,就像普通的Debian软件包一样)以下是control
文件的示例。您只需将其复制粘贴到名为“control”的空文件中,并将其放在DEBIAN文件夹中
Package: ProgramName
Version: VERSION
Architecture: all
Maintainer: YOUR NAME <EMAIL>
Depends: python2.7, etc , etc,
Installed-Size: in_kb
Homepage: http://foo.com
Description: Here you can put a one line description. This is the short Description.
Here you put the long description, indented by 1 space.
如果你想使用dpkg -b <folder>
进行构建,你可以使用this program来完成一个命令。如果你经常建立包装,那么做我提到的所有东西是一件痛苦的事!