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

时间:2011-12-15 02:42:49

标签: python installation

我在python中有一个小程序,它包含一个.py文件和一个程序使用的数据文件目录。

我想知道在Linux上为具有管理员权限的用户创建安装过程的正确方法,以便他可以在他的系统上安装该程序,并从命令行使用选项和参数。 编辑:我遇到问题的部分是让程序安装后检索包含在“数据”子文件夹中的数据文件。

安装/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'

同样,我觉得这有点令人费解。你将如何进行安装?

非常感谢


编辑:解决方案已采用

根据这个问题的答案以及FakeRainBrigand(How to know the path of the running script in Python?)建议的问题,我创建了一个安装脚本,如下所示:

#!/bin/bash
mkdir /usr/share/my_program
chmod +x my_program.py
cp my_program.py /usr/local/bin
cp -r data /usr/share/my_program
echo Installation completed

在我的程序中添加了以下代码:

if os.path.dirname(__file__) == "/usr/local/bin":
    DATA_PATH = "/usr/share/my_program/data"
elif os.path.dirname(__file__) == ".":
    DATA_PATH = "./data"
else:
    print "You do not have a working installation of my_program"
    print "See the installation procedure in the README file"
    sys.exit(1)

然后我使用os.path.join(DATA_PATH, "file-to-reach.txt"),以便程序可以在/usr/share/my_program下找到它的数据。

如果有更多可接受的方法,我很乐意发表评论。

干杯

3 个答案:

答案 0 :(得分:11)

  

我错误的是setup.py方法(即:python setup.py安装),仅用于安装模块,以后在解释器或其他脚本中使用?

是。你错了。

您可以安装到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开头。

  4. 如何实现这一目标?

    #1。

    • 您可以检查PATH并将文件放在PATH上的任何目录中。有很多标准选择。例如/usr/local/bin

    • 您可以修改用户的PATH以包含一些新目录。例如/path/to,以便找到/path/to/my_program.py

    #2。您执行适当的chmod +x

    #3。您编写了适当的代码行。

    有关“Linux Shell”的更多信息,请阅读。所有“shell”程序都具有相同的三个功能。 bashcshpythonperl等等,等等。


      

    检索包含在“数据”子文件夹中的数据文件,同时将其引用为./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' )

    4. 汇总数据路径

答案 1 :(得分: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

根据您的需要,它会变得更加复杂。

答案 2 :(得分:0)

您可以创建一个可执行的zip文件,其中包含您使用的脚本和数据文件。安装只需要将此文件放在$PATH中的某个位置并使其可执行:chmod +x my-program

python: can executable zip files include data files?

如果您创建了一个适当的setup.py来指定如何安装数据文件和脚本,那么还有更多选项来安装程序,例如,

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

可以通过系统打包程序pip安装your-program.tar.gz,您可以使用python setup.py sdist创建{{1}}。