Subtime Text 2 - невозможно запустить команду Windows с пробелами и кавычками

У меня есть небольшой скрипт Python, генерирующий команду Windows:

def quoted(s):
    return '"' + s + '"'

import os
path = 'C:\\Program Files\\SumatraPDF\\SumatraPDF.exe'
params = ' -page 5 '
arg = 'D:\\Dropbox\\Final Term\\Final Draft.pdf'
cmd = quoted(path) + params + quoted(arg)
print cmd
os.system(cmd)

Это не работает внутри Sublime Text 2 (нажатие Ctrl + B):

"C:\Program Files\SumatraPDF\SumatraPDF.exe" -page 5 "D:\Dropbox\Final Term\Final Draft.pdf"
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
[Finished in 0.1s]

но запускается, если я вручную скопирую и вставлю команду (выведенную этим сценарием) в cmd.exe.

Как заставить его работать?


person Bruce    schedule 26.07.2014    source источник
comment
См. superuser.com/questions/279008/   -  person Evan Sebastian    schedule 26.07.2014


Ответы (5)


Это проблема с пространством в вашем пути к файлу (это проблема Windows). os.system () открывает командную оболочку, и это поведение наследуется от вашей командной оболочки. Если вы откроете «ящик DOS» и наберете в нем то же самое, вы получите те же результаты - это командные оболочки Windows, которые требуют цитирования путей со встроенными пробелами. Вам следует использовать еще одну пару кавычек.

person chilliq    schedule 26.07.2014
comment
Не поняла последнее предложение - не могли бы вы объяснить еще немного? - person Bruce; 26.07.2014
comment
попробуйте: path = 'C: \ Program Files \ SumatraPDF \ SumatraPDF.exe' - person chilliq; 26.07.2014
comment
Не работает :( Полная команда была: ""C:\Program Files\SumatraPDF\SumatraPDF.exe"" -page 5 "D:\Dropbox\Final Term\Final Draft.pdf" - person Bruce; 27.07.2014
comment
попробуйте C: \ Program Files \ SumatraPDF \ SumatraPDF.exe -page 5 D: \ Dropbox \ Final Term \ Final Draft.pdf - person jwpfox; 02.08.2014

См. этот ответ, возвышенная часть является вспомогательной, но с помощью интерпретатора python вы можете проверить, что os.system будет работать, если вы используете двойные кавычки вокруг всей строки. Однако вам не нужны кавычки, если вы используете Popen (достаточно умен, чтобы понять это).

Например

>>> cmd = '""C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe""'
>>> os.system(cmd)

or

>>> cmd = 'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe'
>>> Popen(cmd)

Кстати, глядя на ваши комментарии, не заключайте в двойные кавычки путь, не заключайте в двойные кавычки всю команду ""path to exe with spaces" "arg1" "arg2" "arg3"", и вам действительно не нужны все внутренние кавычки, но они не повредят, то есть они должны работать с ""path to exe with spaces arg1 arg2 arg3""

person Wyrmwood    schedule 29.07.2014

Как предполагали другие, модуль subprocess, вероятно, является лучшим решением.

Тем не менее, стоит отметить, что MS Windows по-прежнему обеспечивает перевод файлов старого формата 8.3 для совместимости со старыми программами MS-DOS. Вы можете найти переводы, запустив dir /X в cmd.exe, что обычно показывает, что C:\Program Files может называться C:\Progra~1.

В вашем случае следующее ...

import os
path = 'C:\\Progra~1\\SumatraPDF\\SumatraPDF.exe'
params = ' -page 5 '
arg = 'D:\\Dropbox\\FinalT~1\\FinalD~1.pdf'
cmd = path + params + arg
print cmd
os.system(cmd)

... должно работать.

person Aya    schedule 03.08.2014

os.system устарел. Правильнее всего сделать это - упомянуть Уирмвуда Popen и разделить аргументы:

import subprocess
subprocess.Popen([
    "C:\Program Files\SumatraPDF\SumatraPDF.exe",
    "-page", "5",
    "D:\Dropbox\Final Term\Final Draft.pdf"
])

Затем вы можете создать свою команду, имея список и .extend добавляя в него свои аргументы. Вы можете добавить (+) sys.argv из командной строки и так далее.


В subprocess есть также другие полезные функции, которые позволят вам, скажем, получить вывод команды (checkoutput). Вы, наверное, просто хотите subprocess.call.

Если вы используете простой process = subprocess.Popen(...), будьте готовы вызвать process.wait(), чтобы предотвратить преждевременное завершение.

person Veedrac    schedule 02.08.2014

Мне кажется, это работает. Укажите путь к исполняемому файлу, а затем укажите всю строку.

def quoted(s):
    return '"' + s + '"'

import os
path = "C:\\Program Files\\SumatraPDF\\SumatraPDF.exe"
params = ' -page 5 '
arg = 'D:\\Dropbox\\Final Term\\Final Draft.pdf'

cmd = quoted(quoted(path) + params + arg)
print(cmd)

os.system(cmd)
person Marcelus Trojahn    schedule 04.08.2014