Не удается запустить подпроцесс с моим скриптом после использования Pyinstaller? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть очень simple_script.py, который использует subprocess.run для выполнения «внешней» команды такого рода utility.exe "input_file" -o "output_file" Мой скрипт работает нормально, пока его не скомпилировали с помощью Pyinstaller в один файл. Кстати, я использую следующую команду для преобразования simple_script.py в simple_script.exe:

pyinstaller --onefile --add-binary "utility.exe;." simple_script.py

И мой скрипт выглядит так:

import subprocess, os

print(os.listdir())
cls = 'utility "input_file " -o "output_file"'
command_execution = subprocess.run(cls, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

print(command_execution)

Как вы можете видеть для успешное выполнение simple_script.py У меня должны быть simple_script.py, utility.exe и файлы для обработки. Но когда я запускаю версию моего скрипта в одном файле (utility.exe в комплекте) в каталоге с входным файлом, я получаю две строки:

  1. ['input_file', 'simple_script.exe'] # cause print(os.listdir()) command execution
  2. CompletedProcess(args='utility.exe "input_file.txt" -o "output_file.txt"', returncode=1, stdout=b'', stderr=b"'utility.exe' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n")

Насколько я понимаю, utility.exe не извлекается, поэтому не может быть достигнуто и выполнено. Итак, вопрос - что я делаю не так? Может быть, мне нужно, чтобы файл utility.exe был доступен?

1 Ответ

1 голос
/ 27 апреля 2020

Добавьте нижеприведенную функцию в ваш скрипт

def resource_path(relative):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative)
    else:
        return os.path.join(os.path.abspath("."), relative)

и используйте ее для определения cls:

cls = resource_path('utility.exe') + ' "input_file" -o "output_file"'
...