Как выполнить программу с Python? os.system не работает из-за пробелов в пути

У меня есть сценарий Python, который должен выполнять внешнюю программу, но по какой-то причине не работает.

Если у меня есть следующий скрипт:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

Затем он выходит из строя со следующей ошибкой:

"C:\Temp\a" не распознается как внутренняя или внешняя команда, операционная программа или командный файл.

Если я уйду из программы с кавычками:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

Тогда это работает. Однако, если я добавлю параметр, он перестанет работать снова:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

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

Также обратите внимание, что перемещение программы на нерасширенный путь тоже не является вариантом.


Это тоже не работает:

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

Обратите внимание на замененные одиночные/двойные кавычки.

С или без параметра "Блокнот" здесь он выходит из строя с сообщением об ошибке

Неверное имя файла, имя каталога или тома.

Ответы

Ответ 1

subprocess.call позволит избежать проблем с необходимостью использования условных обозначений различных оболочек. Он принимает список, а не строку, поэтому аргументы более легко разделяются. то есть.

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

Ответ 2

Здесь другой способ сделать это.

Если вы используете Windows, то действуют следующие действия, такие как двойной щелчок по файлу в проводнике или указание имени файла в качестве аргумента для команды "запуска" DOS: файл открывается с любым приложением (если есть), его расширение связано с,

filepath = 'textfile.txt'
import os
os.startfile(filepath)

Пример:

import os
os.startfile('textfile.txt')

Это откроет файл textfile.txt с помощью Notepad, если Notepad связан с файлами.txt.

Ответ 3

Внешние кавычки расходуются самим Python, и оболочка Windows ее не видит. Как упоминалось выше, Windows только понимает двойные кавычки. Python преобразует перемотку в обратную косую черту в Windows, поэтому вы можете использовать

os.system('"C://Temp/a b c/Notepad.exe"')

"Расходуется Python, который затем передает" C://Temp/a b c/Notepad.exe "(в качестве пути Windows, без необходимости двойной обратной косой черты) в CMD.EXE

Ответ 4

Как минимум в Windows 7 и Python 3.1, os.system в Windows требуется, чтобы в командной строке была указана двойная кавычка, если есть пробелы в пути к команде. Например:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

Реальный пример, который меня колотил, - это клонирование диска в VirtualBox. Вышеупомянутое решение subprocess.call не работает из-за некоторых прав доступа, но когда я дважды процитировал команду, os.system стал счастливым:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

Ответ 5

import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

Ответ 6

Я подозреваю, что та же проблема, что и при использовании ярлыков в Windows... Попробуйте следующее:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

Ответ 8

Предположим, мы хотим запустить ваш веб-сервер Django (в Linux), чтобы между вашим путем было свободное пространство (путь = '/home/<you>/<first-path-section> <second-path-section>'), поэтому сделайте следующее:

import subprocess

args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)

[Примечание]:

  • Не забудьте получить разрешение на доступ: chmod 755 -R <'yor path'>
  • manage.py является превосходным: chmod +x manage.py

Ответ 9

Для Python 3.7 используйте subprocess.call. Используйте необработанную строку для упрощения путей Windows:

import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])