Это классическая проблема с командной оболочкой. На самом деле это не специфическая проблема Windows, за исключением того, что в * nix люди никогда не привыкли ставить пробелы в именах файлов, а Windows ставит пробелы в нескольких системных местах по умолчанию, таких как C:\Program Files
.
Что происходит, так это то, что os.execute(str)
реализован в терминах функции ANSI C system(str)
, которая в Windows пытается дублировать эффект ввода "cmd /C "..str
в командной строке. (В * nix он использует / bin / sh -c вместо cmd / C.)
Классическая проблема заключается в том, что необходимо разбить полную командную строку на пробел, чтобы решить, какую программу запускать и каковы ее аргументы.
Ваш первоначальный пример: os.execute("C:\\Program Files\\Movie Maker\\moviemk.exe")
фактически стал cmd /c c:\program files\movie maker\moviemk.exe
, который после разделения его на пробелы CMD попытался найти программу с именем c:\program
для выполнения с аргументами с именами files\movie
и maker\moviemk.exe
. Это не то, что вы хотели.
Решение состоит в том, чтобы быть гораздо более осторожным в цитировании.
Я бы написал так:
os.execute [["C:\Program Files\Movie Maker\Moviemk.exe"]]
Если бы были указаны дополнительные аргументы командной строки, я бы использовал двойные кавычки вокруг каждого и один пробел между аргументами. Использование синтаксиса длинной строки [[...]]
имеет то преимущество, что обратная косая черта не является специальным символом, поэтому вам не нужны дополнительные наклоняющиеся зубочистки, затрудняющие чтение строкового литерала.
Использование двойных кавычек вокруг каждого аргумента должно работать как в Windows, так и в * nix, хотя, конечно, сложнее найти команды, которые одинаковы на обеих платформах.
Еще одна деталь, о которой следует знать, это то, что \Programs Files
может быть не включено C:
. Может даже не быть диска с именем C:
. (Мой рабочий компьютер загружается с E:
, и я нахожу больше программ с ошибками.) Самый простой способ узнать правильный путь - просто использовать переменную окружения ProgramFiles
. Есть много других способов.