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

Linux下小型Python程序(非模块)的正确安装脚本,python,installation,Python,Installation,我有一个python小程序,它包含一个.py文件和一个程序使用的数据文件目录 我想知道在Linux上为具有管理员权限的用户创建安装过程的正确方法,这样他就可以在自己的系统上安装程序,并从命令行使用它,包括选项和参数编辑:我遇到的问题是,程序一旦安装,就会检索包含在“数据”子文件夹中的数据文件。 在/usr/local/bin中安装可执行程序文件和/usr/share/my_program/data中安装数据文件夹的安装脚本是否可以接受?比如: #!/bin/bash # Launch with

我有一个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()提出的问题中的答案,我创建了一个安装脚本,如下所示:

#!/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\u path,“file to reach.txt”)
,这样程序就可以访问它的数据,这些数据可以在
/usr/share/my\u program
下找到

如果有一种更为普遍接受的方法,我很乐意提出意见

干杯

setup.py方法(即:python setup.py install)仅用于安装模块,稍后将在解释器或其他脚本中使用,这是不是错了

对。你错了

您可以安装到Python的脚本目录中。继续阅读
setup.py
可以做的所有事情

这其实非常非常简单。它与Python无关

Python脚本可以在任何地方运行。Linux提供了各种各样的方法使可执行文件(
/path/to/my_program.py
)可以运行

所有这些广泛多样的方式有三个共同点。有三件事是Linux的核心,与Python毫无关系

  • 文件必须位于用户的
    路径上

  • 文件必须具有“执行”权限(
    chmod+x…

  • 文件必须以
    #开头/usr/bin/env python

  • 如何做到这一点

    为了#1

    • 您可以检查路径并将文件放在路径上的任何目录中。这方面有很多标准选择<例如,代码>/usr/local/bin

    • 您可以修改用户路径以包含一些新目录<例如,code>/path/to,以便可以找到
      /path/to/my_program.py

    为了#2。执行相应的
    chmod+x

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

    有关更多信息,请阅读“Linux Shell”。所有“shell”程序都具有相同的三个功能<代码>bash
    csh
    python
    perl
    ,等等


    例如,检索“data”子文件夹中包含的数据文件,同时将其称为
    /data/this_file.dat

    那将是一个糟糕的设计

    Linux(Python之外)提供了许多查找有用数据文件的方法

  • 将它们安装在具有已知路径的已知位置<代码>/usr/local/share浮现在脑海中。这可能不是最好的地点,但它相当受欢迎

  • 使用环境变量<例如,可以将code>MYAPP_HOME设置为文件的位置。您可以使用
    os.path.join(os.environ['MYAPP\u HOME'],'data','this\u file.dat')
    非常流行

  • 使用
    \uuuu文件\uuuu
    变量查找脚本的位置。然后使用
    os.path
    定位目录并将数据路径与
    os.path.join(this_目录,'data','this_file.dat')组合起来。


  • 如果没有需要配置的外部依赖项,如数据库或设置,则应使用简单的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
    

    它可能会变得更复杂,具体取决于您的需要。

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

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

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

    在可以通过系统打包程序安装
    pip
    的地方,
    您的程序.tar.gz
    您可以使用
    python setup.py sdist
    创建
    make
    不仅仅适用于C,但在python程序中可能会觉得不合适。您好,谢谢您的建议。我知道您提到的三个步骤(路径、可执行位和shebang!)。然而,使用这些知识,我无法使程序工作,因为我知道它必须使用子文件夹“data”中的一些文件。由于我目前不知道用户将把程序放在哪里,我无法将文件夹的路径“硬编码”到代码中(这在任何情况下都可能是一个非常糟糕的主意)。我正在寻找一个安装过程,既可以使程序文件在路径中找到,也可以使它指向dat