Linux下小型Python程序(非模块)的正确安装脚本
我有一个python小程序,它包含一个.py文件和一个程序使用的数据文件目录 我想知道在Linux上为具有管理员权限的用户创建安装过程的正确方法,这样他就可以在自己的系统上安装程序,并从命令行使用它,包括选项和参数编辑:我遇到的问题是,程序一旦安装,就会检索包含在“数据”子文件夹中的数据文件。 在Linux下小型Python程序(非模块)的正确安装脚本,python,installation,Python,Installation,我有一个python小程序,它包含一个.py文件和一个程序使用的数据文件目录 我想知道在Linux上为具有管理员权限的用户创建安装过程的正确方法,这样他就可以在自己的系统上安装程序,并从命令行使用它,包括选项和参数编辑:我遇到的问题是,程序一旦安装,就会检索包含在“数据”子文件夹中的数据文件。 在/usr/local/bin中安装可执行程序文件和/usr/share/my_program/data中安装数据文件夹的安装脚本是否可以接受?比如: #!/bin/bash # Launch with
/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
- 您可以检查路径并将文件放在路径上的任何目录中。这方面有很多标准选择<例如,代码>/usr/local/bin
- 您可以修改用户路径以包含一些新目录<例如,code>/path/to,以便可以找到
/path/to/my_program.py
chmod+x
为了#3。您可以编写适当的代码行
有关更多信息,请阅读“Linux Shell”。所有“shell”程序都具有相同的三个功能<代码>bashcsh
,python
,perl
,等等
例如,检索“data”子文件夹中包含的数据文件,同时将其称为
/data/this_file.dat
那将是一个糟糕的设计
Linux(Python之外)提供了许多查找有用数据文件的方法
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