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