Преобразование скрипта Python, который запускает скрипт bash, в исполняемый файл с помощью Pyinstaller

Я хочу преобразовать скрипт python, который запускает локальный скрипт bash в исполняемый файл с помощью Pyinstaller.

Моя структура проекта выглядит следующим образом:

Project/
|-- bash_script/
|   |-- script.sh
|-- main.py

В файле main.py есть строка, которая запускает скрипт локально:

output = subprocess.check_output('./bash_script/script.sh', shell=True).decode()

Теперь, после преобразования main.py в исполняемый файл в Linux, если я запущу его в другом месте, чем main.py, скрипт не будет найден.

Я хочу добавить сценарий оболочки в исполняемый файл python, чтобы он не зависит от сценария локально, но у меня будет только исполняемый файл и это в конечном итоге будет работать.

Я попытался использовать флаг --add-data для преобразования команды pyinstaller, однако это не сработало.

Спасибо!


Примечание. Я использую следующую команду:

pyinstaller --add-data "./bash_script/script.sh:." --onefile main.py

и я получаю сообщение об ошибке после запуска в dist dir:

/bin/sh: 1: ./bash_script/script.sh: not found

Согласно serverfault.com/questions/319115/… вы можете передать скрипт bash в bash через стандартный ввод. Таким образом, вы можете встроить скрипт bash в виде строки в скрипт Python и передать его в bash.

Michael Butscher 27.11.2022 09:49

@MichaelButscher Я не хочу конвейеризировать результат исполняемого файла, потому что в конечном итоге мне нужен один исполняемый файл, который я могу запустить из любого места, и он все равно будет работать.

Chopin 27.11.2022 09:54

Я имел в виду, что вы должны использовать «подпроцесс» для запуска bash в процессе и подачи сценария на стандартный ввод bash. Это не имеет ничего общего с stdin или stdout вашего исполняемого файла.

Michael Butscher 27.11.2022 10:51

О, хорошо, но как я могу это сделать? потому что я вызываю скрипт bash внутри того, что я пытаюсь преобразовать в исполняемый файл. Может быть, вы можете уточнить это? Спасибо!

Chopin 27.11.2022 10:55

@MichaelButscher Прости, забыл отметить тебя.

Chopin 27.11.2022 11:11

@Chopin, пожалуйста, опубликуйте команду, которую вы используете для запуска pyinstaller ... использование параметра add-data должно быть всем, что вам нужно сделать

Alexander 27.11.2022 11:46

@Александр Опубликовал это...

Chopin 27.11.2022 12:05

Я работаю над ответом

Alexander 27.11.2022 12:07

По сути, вы можете определить переменную «скрипт», содержащую скрипт bash, как объект байтов и вызвать output = subprocess.check_output('bash', input=script, shell=False).decode().

Michael Butscher 27.11.2022 12:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
9
325
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем main.py:

import subprocess
import os

script = os.path.join(os.path.dirname(__file__),'bash_script','script.sh')
output = subprocess.check_output(script, shell=True).decode()
print(output)

Затем запустите:

pyinstaller -F --add-data ./bash_script/script.sh:./bash_script main.py

И качает вашего дядю!

p.s. -F то же, что --onefile

Другие вопросы по теме