У меня есть сценарий Python, который должен выполнить внешнюю программу, но по какой-то причине не работает.
Если у меня есть следующий сценарий:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Затем происходит сбой со следующей ошибкой:
'C:\Temp\a' is not recognized as an internal or external command, operable program or batch file.
Если я выйду из программы в кавычках:
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();
Обратите внимание на замененные одинарные / двойные кавычки.
С параметром Блокнота или без него, он выдает сообщение об ошибке
The filename, directory name, or volume label syntax is incorrect.
Для будущих посетителей, если вы хотите запустить приложение с аргументами (используя подпроцесс). вам нужно разделить свои аргументы по пробелу и передать каждый по отдельности. Например, это из файла bat: "C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif". В Python это становится: ["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"].






Я подозреваю, что это та же проблема, что и при использовании ярлыков в Windows ... Попробуйте следующее:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
извините, это тоже не работает, отредактированный вопрос, чтобы отразить это.
Я думаю, что Windows использует только ", а не" для цитирования. Это, вероятно, сработает, если вы измените это. Однако вы все равно столкнетесь с проблемами, если у вас есть встроенные кавычки и т. д.
Я думал, потребовалось и то, и другое, но ты, наверное, прав. Я знаю, что он работает (по крайней мере, в оболочке) с двойными кавычками.
+1 это лучший, windows XP, домашняя версия 2007 работала хорошо
subprocess.call позволит избежать проблем с необходимостью иметь дело с соглашениями о кавычках в различных оболочках. Он принимает список, а не строку, поэтому аргументы легче разделить. т.е.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
В Windows гораздо проще использовать необработанную строку: r "C: \ Temp \ a b c \ Notepad.exe"
Другой вариант - использовать или не использовать функции exec *, которые также находятся в sys из памяти. Они берут массив аналогичным образом, но я не думаю, что они когда-нибудь вернутся. Не уверен насчет семантики здесь, я помню, что там упоминалось о перезаписи текущего процесса, так что ...
Да, функции os.exec * заменят текущий процесс, поэтому ваш процесс python не будет продолжен. Они больше используются в unix, где общий метод запуска команды оболочкой - это fork (), а затем exec () в дочернем элементе.
Вместо этого можно использовать метод windows для этого семейства os.spawn. subprocess, тем не менее, более переносимый и предлагает большую гибкость в управлении процессом (захват ввода / вывода и т. д.), поэтому предпочтительнее.
@PierreBdr: Есть случай, когда необработанные строки не будут работать: вам понадобится косая черта в конце. например, r'c: \ foo \ bar \ '. На самом деле, вероятно, лучше использовать косую черту. Они принимаются во всем API Windows (хотя не всегда некоторыми командами оболочки (например, копией))
Я пробовал то же решение, но получаю OSERRoR: Permission denied
Для python> = 3.5 subprocess.call следует заменить на subprocess.rundocs.python.org/3/library/subprocess.html#older-high-level-a pi
Вот другой способ сделать это.
Если вы используете Windows, следующие действия похожи на двойной щелчок по файлу в проводнике или указание имени файла в качестве аргумента для команды «start» DOS: файл открывается в любом приложении (если есть), с которым связано его расширение. .
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Пример:
import os
os.startfile('textfile.txt')
Это откроет textfile.txt с помощью Блокнота, если Блокнот связан с файлами .txt.
Есть ли эквивалентная функция для систем * nix?
@Romeno: вы можете попробовать: webbrowser.open("textfile.txt"), он должен открывать текстовый редактор. См. Также "запустить вторую программу полностью самостоятельно, как если бы я дважды щелкнул по ней".
В моей настройке textfile.txt должен быть в кавычках, например: os.startfile('path\to\textfile.txt')
Самые внешние кавычки используются самим 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
Это кажется лучшим в таком сценарии, как os.system('curl URL > file'), где я хочу видеть, как обновляется индикатор выполнения cURL для действительно больших файлов.
Если первая буква после обратной косой черты имеет особое значение (например, \t, \n и т. д.), То эта конкретная обратная косая черта должна быть удвоена. Путь к Windows не имеет к этому никакого отношения.
Обратите внимание, что если вы используете os.system() в Windows, окно cmd откроется и останется открытым до тех пор, пока вы не закроете запущенный процесс. ИМХО лучше использовать os.startfile().
Не забывайте import os
у меня не работает stackoverflow.com/questions/56241616/…
По крайней мере, в 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)
Вот и все! Я бы выбрал subprocess, но иногда os.system и os.popen(...).read() просто набирают быстрее. Кстати, вам не нужно избегать двойных кавычек внутри одиночных, то есть '""C:\\Temp\\a b c\\Notepad.exe""'.
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
и кажется, что для этого метода не требуется цитирование, например win32api.WinExec ('pythonw.exe d: \ web2py \ web2py.py -K welcome') запускает планировщик web2py в фоновом режиме.
@rahul и разве это кроме аргументов для исполняемого файла? Итак, если вы хотите, чтобы Блокнот открывал файл или он отдельный?
Для 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'])
Предположим, мы хотим запустить ваш веб-сервер Django (в Linux), между которыми есть пробел (path = '/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Для Python 3.7 используйте subprocess.call. Используйте необработанную строку для упрощения путей Windows:
import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])
Нет необходимости в подпроцессе, это может быть просто достигнуто
GitPath = "C:\\Program Files\\Git\\git-bash.exe"# Application File Path in mycase its GITBASH
os.startfile(GitPath)
Используйте это:
os.system(r'C:\temp\"a b c"\Notepad.exe')или это:os.system('C:\\temp\\"a b c"\\Notepad.exe')