#python #subprocess #python-3.8
#python #подпроцесс #python-3.8
Вопрос:
Я использую python 3.8 на компьютере с Windows 10 для создания с помощью pyinstaller EXE-файла с помощью метода subprocess.run(command). -Я новичок в использовании подпроцесса — эта часть работает
Pyinstaller генерирует файл * .spec и создает папки, которые я хочу удалить после создания EXE-файла. Я также использую подпроцесс для команд удаления.
Моя логика заключается в следующем:
import os
import subprocess
import sys
import time
file_name = 'Discovery'
# Delete temp files and folders.
print("Deleting temp files...")
time.sleep(5) # Sleep for 5 seconds
folder_to_delete = '{}/build'.format(os.path.abspath(os.getcwd()))
file_to_delete = '{}/{}.spec'.format(os.path.abspath(os.getcwd()), file_name)
if sys.platform == "win32":
delete_folder_command = f'rmdir /F/Q/S {folder_to_delete}'
delete_file_command = f'del {file_to_delete}'
if sys.platform == "darwing":
delete_folder_command = f'rm -r {folder_to_delete}'
delete_file_command = f'rm {file_to_delete}'
subprocess.run(delete_folder_command)
subprocess.run(delete_file_command)
папка сборки и файл *.spec существуют
Но я получаю следующую ошибку:
FileNotFoundError: [WinError 2] The system cannot find the file specified
с трассировкой, начинающейся со строки
subprocess.run(delete_folder_command)
Я пытался форматировать команду различными способами, но безуспешно.
Например:
folder_to_delete = build
file_to_delete = f'{file_name}.spec'
delete_folder_command = f'rmdir /F/Q/S {folder_to_delete}'
delete_file_command = f'del {file_to_delete}'
subprocess.run('cd {}'.format(os.path.abspath(os.getcwd())
subprocess.run(delete_file_command)
subprocess.run(delete_folder_command)
в этом последнем случае трассировка начинается со строки
subprocess.run('cd {}'.format(os.path.abspath(os.getcwd())
Кажется, это проблема os.path.abspath(os.getcwd()
, но я использую ее в другом месте в логике без проблем с форматированным текстом.
create_exe_file_command = 'pyinstaller -F -w -i"{}" --add-data="{}/img;." -n"{}" discovery.py'.format(icon_path, os.path.abspath(os.getcwd()),file_name)
Может быть, я слепой или мне просто нужна вторая пара глаз, но я не могу понять, почему я получаю ошибку.
Буду признателен, если вы укажете мне правильное направление.
Комментарии:
1. Можете ли вы
print(delete_folder_command)
проверить правильность команды и пути к файлу? Вы пробовали это на обеих платформах, работает ли это на одной, но не на другой? Если да, то на какой платформе он не работает?2.@Dillanm, спасибо за ваш комментарий. В настоящее время у меня нет компьютера macOS. Это будет протестировано в ближайшем будущем. Что касается печати команды delete_folder и команды delete_file_command, да, я получаю правильный путь и команду:
print(delete_folder_command)
выводrmdir /S C:Edumargdiscovery/build
print(delete_file_command)
выводаdel C:Edumargdiscovery/Discovery.spec
Ответ №1:
rmdir реализован в интерпретаторе оболочки. Чтобы запустить его, вам нужно сообщить subprocess.run, что вы хотите запускать свои команды в оболочке, перейдя shell=True
к ней..
Комментарии:
1. Спасибо, рашани, это сработало для файла, а не для папки. Я больше не получаю сообщение об ошибке, но я получаю следующее: ` Система не может найти указанный путь. «`
2. @edumarg docs.python.org/3/library/subprocess.html — вы не должны передавать одну строку subprocess.run.. вы должны передать массив ..
Ответ №2:
Все, что вам нужно, это поместить команды в список.
Пример:
В моем случае я создал папку, а внутри папки я создал файл. Теперь следующий код сначала удалит файл, а затем папку.
import os
import subprocess
folder_to_delete = 'build'
file = 'Discovery.spec'
file_to_delete = f'{folder_to_delete}/{file}'
base_dir = ['cd', os.path.abspath(os.getcwd())]
folder_command = ['rmdir', folder_to_delete]
file_command = ['rm',file_to_delete ]
subprocess.run(base_dir)
subprocess.run(file_command)
subprocess.run(folder_command)
Комментарии:
1. Лоаннис Э. Комм, спасибо за ваш ответ. К сожалению, я все еще получаю
FileNotFoundError: [WinError 2] The system cannot find the file specified
on linesubprocess.run(f'cd'.format(os.path.abspath(os.getcwd())))
, даже если я изменяю его наsubprocess.run(['cd', os.path.abspath(os.getcwd())])
2. Не знаю, m8, в чем проблема, смотрите мое видео здесь <br> loom.com/share/7cc753c536b34e40973509d08a6544a1 .
3. Спасибо, Иоаннис Э. Комм, я посмотрю видео, в котором я реализовал команду в виде списка, как вы упомянули, а затем shell =True, как упоминает рашани. он работает только для файла, но не для папки.
4. Иоаннис Э. Комм, я заметил, что вы используете macOS. Да, это одна из ОС, которую мне нужно будет использовать в будущем, и ваш ответ поможет мне, как только я начну тестирование в этой ОС. Так что большое вам спасибо. На данный момент проблема связана с Windows 10.