Linux下小型Python程序(非模块)的正确安装脚本
我有一个小程序,是用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 个回答
你可以创建一个可执行的压缩文件,这个文件里包含了你的脚本和它所需要的数据文件。安装的时候只需要把这个文件放到一个在 $PATH
中的地方,然后让它可以执行:chmod +x my-program
。
如果你创建一个合适的 setup.py
文件,里面说明了如何安装你的数据文件和脚本,那么就有很多其他的安装选项,比如:
$ pip install --user http://example.com/your-program.tar.gz
其中 pip
可以通过系统的包管理工具来安装,而 your-program.tar.gz
可以通过 python setup.py sdist
来创建。
如果你没有外部依赖,比如数据库或者需要配置的设置,那么一个简单的 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
不过,根据你的需求,这个过程可能会变得更复杂。
我是不是错了,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没有关系。
文件必须在用户的
PATH
中。文件必须有“执行”权限(
chmod +x ...
)。文件必须以
#!/usr/bin/env python
开头。
怎么做到这一点呢?
关于第一点:
你可以检查
PATH
并把文件放在PATH
中的任何目录里。有很多标准选择,比如/usr/local/bin
。你可以修改用户的
PATH
,加入一个新的目录。例如/path/to
,这样/path/to/my_program.py
就能被找到。
关于第二点。你需要执行相应的chmod +x
命令。
关于第三点。你需要写上相应的代码行。
想了解更多,可以看看“Linux Shell”。所有的“shell”程序都有这三种特性。比如bash
、csh
、python
、perl
等等。
从一个名为“data”的子文件夹中获取数据文件,同时引用它们,比如
./data/this_file.dat
。
这样设计是不太好的。
Linux(在Python之外)提供了很多方法来找到有用的数据文件。
把它们安装在一个已知位置,路径也要明确。比如
/usr/local/share
。这可能不是最好的位置,但相对来说比较常见。使用环境变量。比如
MYAPP_HOME
可以设置为文件的位置。然后你可以用os.path.join( os.environ['MYAPP_HOME'], 'data', 'this_file.dat' )
来引用,非常流行。使用
__file__
变量来找出你的脚本位置。然后用os.path
来定位目录,并用os.path.join( this_directory, 'data', 'this_file.dat' )
来组装数据路径。