Python 3.8 Подпроцесс.run (команда) для удаления папки и файла получает ошибку FileNotFoundError: [WinError 2] Система не может найти указанный файл

#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 line subprocess.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.