Правильный установочный скрипт для небольшой программы на Python (не для модуля) под Linux - PullRequest
8 голосов
/ 15 декабря 2011

У меня есть небольшая программа на 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, кроме:

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

Опять же, я чувствую, что это немного запутанно.Как бы вы продолжили установку?

Большое спасибо


РЕДАКТИРОВАТЬ: РЕШЕНИЕ ПРИНЯТО

На основании ответов на этот вопрос ик тем в вопросе, предложенном FakeRainBrigand ( Как узнать путь запуска скрипта в 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.

Я был бы рад получить комментарииесли доступен более приемлемый метод.

Cheers

Ответы [ 3 ]

11 голосов
/ 15 декабря 2011

Я ошибаюсь, что метод 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.

Как это сделать?

Для № 1.

  • Вы можете проверить PATH и поместить файл в любой из каталогов в PATH. Есть много стандартных вариантов для этого. /usr/local/bin, например.

  • Вы можете изменить PATH пользователя, добавив в него новый каталог. /path/to, например, чтобы можно было найти /path/to/my_program.py.

Для № 2. Вы выполняете соответствующие chmod +x.

Для № 3. Вы пишете соответствующую строку кода.

Для получения дополнительной информации читайте о "Linux Shell". Все программы-оболочки имеют три одинаковые функции. bash. csh, python, perl и т. Д. И т. Д. И т. П.


извлекает файлы данных, содержащиеся в подпапке «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' )

2 голосов
/ 15 декабря 2011

Если у вас нет внешних зависимостей, таких как базы данных или параметры, которые необходимо настроить, подойдет простой скрипт 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

Это может усложниться в зависимости от ваших потребностей.

0 голосов
/ 15 декабря 2011

Вы можете создать исполняемый zip-файл, содержащий ваш скрипт и файлы данных, которые он использует.При установке просто нужно поместить этот файл где-нибудь в $PATH и сделать его исполняемым: chmod +x my-program.

python: могут ли исполняемые файлы zip включать файлы данных?

Если вы создадите соответствующий setup.py, в котором будет указано, как установить файлы данных и сценарий, появится множество других вариантов установки программы, например,

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

, где pipможет быть установлен через системный упаковщик, your-program.tar.gz вы можете создать с помощью python setup.py sdist.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...