Как выполнить программу с 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");
Ответ 7
Для python> = 3.5 subprocess.run
следует использовать вместо subprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', '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'])