Я хочу преобразовать скрипт 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
@MichaelButscher Я не хочу конвейеризировать результат исполняемого файла, потому что в конечном итоге мне нужен один исполняемый файл, который я могу запустить из любого места, и он все равно будет работать.
Я имел в виду, что вы должны использовать «подпроцесс» для запуска bash в процессе и подачи сценария на стандартный ввод bash. Это не имеет ничего общего с stdin или stdout вашего исполняемого файла.
О, хорошо, но как я могу это сделать? потому что я вызываю скрипт bash внутри того, что я пытаюсь преобразовать в исполняемый файл. Может быть, вы можете уточнить это? Спасибо!
@MichaelButscher Прости, забыл отметить тебя.
@Chopin, пожалуйста, опубликуйте команду, которую вы используете для запуска pyinstaller
... использование параметра add-data должно быть всем, что вам нужно сделать
@Александр Опубликовал это...
Я работаю над ответом
По сути, вы можете определить переменную «скрипт», содержащую скрипт bash, как объект байтов и вызвать output = subprocess.check_output('bash', input=script, shell=False).decode()
.
В вашем 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
Согласно serverfault.com/questions/319115/… вы можете передать скрипт bash в bash через стандартный ввод. Таким образом, вы можете встроить скрипт bash в виде строки в скрипт Python и передать его в bash.