У меня есть сценарий 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();
Обратите внимание на замененные одинарные / двойные кавычки.
С или без параметра для Блокнота здесь, это не с сообщением об ошибке
Неверный синтаксис имени файла, имени каталога или метки тома.
источник
os.system(r'C:\temp\"a b c"\Notepad.exe')
или это:os.system('C:\\temp\\"a b c"\\Notepad.exe')
"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"]
.Ответы:
subprocess.call
позволит избежать проблем, связанных с цитированием соглашений различных оболочек. Он принимает список, а не строку, поэтому аргументы легче разделить. т.е.источник
subprocess.call
следует заменить наsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiВот другой способ сделать это.
Если вы используете Windows, следующие действия аналогичны двойному щелчку файла в проводнике или присвоению имени файла в качестве аргумента команде «start» DOS: файл открывается любым приложением (если оно есть), с которым связано его расширение. ,
Пример:
Откроется textfile.txt с помощью Блокнота, если Блокнот связан с файлами .txt.
источник
webbrowser.open("textfile.txt")
он должен открыть текстовый редактор. Смотрите также «Запустите вторую программу полностью самостоятельно, как будто я просто« дважды щелкнул по ней »».os.startfile('path\to\textfile.txt')
Внешние кавычки потребляются самим Python, а оболочка Windows не видит его. Как упоминалось выше, Windows понимает только двойные кавычки. Python преобразует прямую косую черту в обратную косую черту в Windows, так что вы можете использовать
'Используется Python, который затем передает "C: //Temp/abc/Notepad.exe" (как путь Windows, двойная обратная косая черта не требуется) в CMD.EXE
источник
os.system('curl URL > file')
где я хочу увидеть обновление индикатора прогресса cURL для действительно больших файлов.\t
,\n
и т.д.) , то этот конкретный символ должен быть удвоен. Быть пути Windows не имеет к этому никакого отношения.os.system()
Windows, окно cmd будет открываться и оставаться открытым до тех пор, пока вы не закроете запущенный процесс. ИМХО лучше использоватьos.startfile()
.import os
По крайней мере, в Windows 7 и Python 3.1
os.system
в Windows требуется, чтобы командная строка заключалась в двойные кавычки, если в пути к команде есть пробелы. Например:Примером из реальной жизни, который меня озадачил, было клонирование диска в VirtualBox. Приведенное
subprocess.call
выше решение не сработало из-за некоторых проблем с правами доступа, но когда я дважды цитировал команду, онos.system
обрадовался:источник
subprocess
, но иногдаos.system
иos.popen(...).read()
просто быстрее набрать. Кстати, вам не нужно , чтобы избежать двойных кавычек внутри одного, то'""C:\\Temp\\a b c\\Notepad.exe""'
будет делать.источник
Для python> = 3.5
subprocess.run
следует использовать вместоsubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
источник
Я подозреваю, что это та же проблема, что и при использовании ярлыков в Windows ... Попробуйте это:
источник
Предположим, что мы хотим запустить ваш веб-сервер Django (в Linux), чтобы между вашим путем (path =
'/home/<you>/<first-path-section> <second-path-section>'
) было свободное пространство , поэтому сделайте следующее:[ Примечание ]:
chmod 755 -R <'yor path'>
manage.py
является исключительным:chmod +x manage.py
источник
Для Python 3.7 используйте subprocess.call . Используйте необработанную строку для упрощения путей Windows:
источник
Нет необходимости в подпроцессе, он может быть просто достигнут
GitPath = "C: \ Program Files \ Git \ git-bash.exe" # Путь к файлу приложения в mycase, его файл GITBASH os.startfile (GitPath)
источник