У меня есть сценарий 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();
Обратите внимание на поменянные местами одинарные и двойные кавычки.
С параметром или без параметра Блокнота здесь, он терпит неудачу с сообщением об ошибке
Синтаксис имени файла, имени каталога или метки тома неверен.
subprocess.call
позволит избежать проблем с согласованием кавычек в различных оболочках. Она принимает список, а не строку, поэтому аргументы легче разграничить. т.е.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Вот другой способ сделать это.
Если вы используете Windows, то следующие действия подобны двойному щелчку на файле в Проводнике или указанию имени файла в качестве аргумента команды DOS "start": файл открывается с помощью приложения (если таковое имеется), с которым связано его расширение.
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Пример:
import os
os.startfile('textfile.txt')
Это откроет textfile.txt с помощью блокнота, если блокнот ассоциирован с файлами .txt.
Котировки внешних потребляется сам по себе Python и оболочки Windows не'т вижу. Как уже упоминалось выше, Windows понимает только двойные кавычки. В Python преобразует вперед-рубанули на обратные слеши на Windows, так что вы можете использовать
os.system('"C://Temp/a b c/Notepad.exe"')
В ' используется Python, который затем передает "в C://Temp/a б/Блокнот.ехе и" (как путь Windows, без двойных слешей надобности) CMD.EXE
По крайней мере в Windows 7 и Python 3.1, `ОС.системы в Windows хочет командной строки в двойных кавычках если есть пробелы в пути к команде. Например:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
Реальный пример, что меня ввело в заблуждение было клонирование диска в VirtualBox. В подпроцесса.вышеуказанное решение называть это't работа из-за какой-то вопрос по правам доступа, но когда я дважды приводил команду
ОС.система стала счастливой:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
Я подозреваю, что это 'та же проблема, что и при использовании ярлыков в Windows... Попробуйте это:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Для Python >= 3.5 подпроцесса.прогон должен быть использован в месте подпроцесса.вызов
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
Допустим, вы хотите запустить ваш веб-сервер Джанго (в Linux), что есть пространство между ваш путь (путь='/домой/в<вы>/<первый путь-раздел> <второй путь-раздел>'
), чтобы сделать следующее:
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_)
[Примечание]:
чмод 755 -Р <'свой путь'>
manage.py-это exceutable:
чмод +х manage.py`Для Python 3.7, используйте подпроцесс.звонок. Использовать сырые строки для упрощения пути Windows:
import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])