Linux下小型Python程序(非模块)的正确安装脚本

9 投票
4 回答
7299 浏览
提问于 2025-04-17 08:24

我有一个小程序,是用Python写的,包含一个.py文件和一个程序用到的数据文件夹。

我想知道在Linux上,怎样才能为有管理员权限的用户创建一个合适的安装步骤,让他们可以在自己的系统上安装这个程序,并通过命令行使用它,带上选项和参数。编辑:我遇到的问题是,安装后程序如何找到存放在“data”子文件夹里的数据文件。

如果我写一个安装脚本,把可执行的程序文件放在/usr/local/bin,把数据文件夹放在/usr/share/my_program/data,这样可以吗?大概是这样的:

#!/bin/bash
# Launch with sudo
chmod +x program.py
cp program.py /usr/local/bin
cp -r data /usr/share/my_program
echo Installation complete

为了做到这一点,我需要在程序里假设数据文件会放在/usr/share/my_program/data。但我也想让用户有选择,不安装程序也能使用它。那么我就得假设数据文件在可执行程序文件的相对路径'./data'里。我该怎么解决这个问题呢?我想到了一些办法,但感觉自己在搞得很复杂,其实应该有一个清晰正确的答案。

目前,我在考虑使用一个try except语句:

try:
    find data from /usr/share/my_program && set path accordingly
except:
    set path to the data as './data'

不过,我觉得这样有点复杂。你们会怎么处理安装的问题呢?

4 个回答

0

你可以创建一个可执行的压缩文件,这个文件里包含了你的脚本和它所需要的数据文件。安装的时候只需要把这个文件放到一个在 $PATH 中的地方,然后让它可以执行:chmod +x my-program

python: 可执行的压缩文件可以包含数据文件吗?

如果你创建一个合适的 setup.py 文件,里面说明了如何安装你的数据文件和脚本,那么就有很多其他的安装选项,比如:

$ pip install --user http://example.com/your-program.tar.gz

其中 pip 可以通过系统的包管理工具来安装,而 your-program.tar.gz 可以通过 python setup.py sdist 来创建。

2

如果你没有外部依赖,比如数据库或者需要配置的设置,那么一个简单的 setup.sh 脚本就可以搞定了。

DIR=`pwd`
NAME=my_app.py
echo "#!/usr/bin/env sh 
python $DIR/my_app.py" > /usr/sbin/$NAME
chmod a+x /usr/sbin/$NAME

不过,根据你的需求,这个过程可能会变得更复杂。

12

我是不是错了,setup.py这个方法(也就是:python setup.py install)只是用来安装模块,以后可以在解释器或其他脚本中使用?

是的,你错了。

你可以把它安装到Python的脚本目录里。继续了解一下setup.py能做的事情。http://docs.python.org/distutils/setupscript.html#installing-scripts

其实这非常简单,而且和Python没有关系。

Python脚本可以在任何地方运行。Linux提供了很多种方法来让一个可执行文件(/path/to/my_program.py)可以被运行。

这些方法有三个共同点。这三点是Linux的核心内容,和Python没有关系。

  1. 文件必须在用户的PATH中。

  2. 文件必须有“执行”权限(chmod +x ...)。

  3. 文件必须以#!/usr/bin/env python开头。

怎么做到这一点呢?

关于第一点:

  • 你可以检查PATH并把文件放在PATH中的任何目录里。有很多标准选择,比如/usr/local/bin

  • 你可以修改用户的PATH,加入一个新的目录。例如/path/to,这样/path/to/my_program.py就能被找到。

关于第二点。你需要执行相应的chmod +x命令。

关于第三点。你需要写上相应的代码行。

想了解更多,可以看看“Linux Shell”。所有的“shell”程序都有这三种特性。比如bashcshpythonperl等等。


从一个名为“data”的子文件夹中获取数据文件,同时引用它们,比如./data/this_file.dat

这样设计是不太好的。

Linux(在Python之外)提供了很多方法来找到有用的数据文件。

  1. 把它们安装在一个已知位置,路径也要明确。比如/usr/local/share。这可能不是最好的位置,但相对来说比较常见。

  2. 使用环境变量。比如MYAPP_HOME可以设置为文件的位置。然后你可以用os.path.join( os.environ['MYAPP_HOME'], 'data', 'this_file.dat' )来引用,非常流行。

  3. 使用__file__变量来找出你的脚本位置。然后用os.path来定位目录,并用os.path.join( this_directory, 'data', 'this_file.dat' )来组装数据路径。

撰写回答