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

У меня есть сценарий 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.

Используйте это: os.system(r'C:\temp\"a b c"\Notepad.exe') или это: os.system('C:\\temp\\"a b c"\\Notepad.exe')

chanzerre 11.08.2016 10:15

Для будущих посетителей, если вы хотите запустить приложение с аргументами (используя подпроцесс). вам нужно разделить свои аргументы по пробелу и передать каждый по отдельности. Например, это из файла 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"].

akinuri 09.06.2018 14:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
288
2
690 789
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

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

извините, это тоже не работает, отредактированный вопрос, чтобы отразить это.

Lasse V. Karlsen 15.10.2008 12:29

Я думаю, что Windows использует только ", а не" для цитирования. Это, вероятно, сработает, если вы измените это. Однако вы все равно столкнетесь с проблемами, если у вас есть встроенные кавычки и т. д.

Brian 15.10.2008 12:39

Я думал, потребовалось и то, и другое, но ты, наверное, прав. Я знаю, что он работает (по крайней мере, в оболочке) с двойными кавычками.

Matthew Scharley 15.10.2008 13:18

+1 это лучший, windows XP, домашняя версия 2007 работала хорошо

user285594 16.07.2012 16:16
Ответ принят как подходящий

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"

PierreBdR 15.10.2008 13:11

Другой вариант - использовать или не использовать функции exec *, которые также находятся в sys из памяти. Они берут массив аналогичным образом, но я не думаю, что они когда-нибудь вернутся. Не уверен насчет семантики здесь, я помню, что там упоминалось о перезаписи текущего процесса, так что ...

Matthew Scharley 15.10.2008 13:27

Да, функции os.exec * заменят текущий процесс, поэтому ваш процесс python не будет продолжен. Они больше используются в unix, где общий метод запуска команды оболочкой - это fork (), а затем exec () в дочернем элементе.

Brian 15.10.2008 15:14

Вместо этого можно использовать метод windows для этого семейства os.spawn. subprocess, тем не менее, более переносимый и предлагает большую гибкость в управлении процессом (захват ввода / вывода и т. д.), поэтому предпочтительнее.

Brian 15.10.2008 15:16

@PierreBdr: Есть случай, когда необработанные строки не будут работать: вам понадобится косая черта в конце. например, r'c: \ foo \ bar \ '. На самом деле, вероятно, лучше использовать косую черту. Они принимаются во всем API Windows (хотя не всегда некоторыми командами оболочки (например, копией))

Brian 15.10.2008 17:11
Да, файл os.exec functions will replace the current process* - not on Windows; see bugs.python.org/issue9148#msg109179
Piotr Dobrogost 04.08.2013 18:04

Я пробовал то же решение, но получаю OSERRoR: Permission denied

Pratik Singhal 07.10.2013 11:52

Для python> = 3.5 subprocess.call следует заменить на subprocess.rundocs.python.org/3/library/subprocess.html#older-high-level-a‌ pi

gbonetti 22.01.2018 13:40

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

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

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

Пример:

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

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

Есть ли эквивалентная функция для систем * nix?

Romeno 11.06.2012 19:31

@Romeno: вы можете попробовать: webbrowser.open("textfile.txt"), он должен открывать текстовый редактор. См. Также "запустить вторую программу полностью самостоятельно, как если бы я дважды щелкнул по ней".

jfs 16.11.2012 19:50

В моей настройке textfile.txt должен быть в кавычках, например: os.startfile('path\to\textfile.txt')

thdoan 30.12.2014 06:58

Самые внешние кавычки используются самим 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 для действительно больших файлов.

Zach Young 07.12.2013 01:22

Если первая буква после обратной косой черты имеет особое значение (например, \t, \n и т. д.), То эта конкретная обратная косая черта должна быть удвоена. Путь к Windows не имеет к этому никакого отношения.

Ethan Furman 12.11.2014 17:11

Обратите внимание, что если вы используете os.system() в Windows, окно cmd откроется и останется открытым до тех пор, пока вы не закроете запущенный процесс. ИМХО лучше использовать os.startfile().

thdoan 30.12.2014 07:09

Не забывайте import os

Besi 09.09.2015 11:33

у меня не работает stackoverflow.com/questions/56241616/…

Gulzar 21.05.2019 19:12

По крайней мере, в 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""'.

Tomasz Gandor 28.09.2016 17:23

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 в фоновом режиме.

Tim Richardson 26.07.2012 15:29

@rahul и разве это кроме аргументов для исполняемого файла? Итак, если вы хотите, чтобы Блокнот открывал файл или он отдельный?

sayth 30.07.2012 07:40

Для 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)

Другие вопросы по теме