2012-04-30 1 views
0

Я пытаюсь открыть путь , чтобы файл с каким-либо приложением. Проблема в том, что путь содержит различные управляющие символы, которые затрудняют открытие файла. Следующий код показывает мою последнюю попытку, которая префикс управляющих символов с \, но это странно открывает файл много раз (например, в бесконечном цикле).Путь с контрольными символами в качестве аргумента для оболочки из Python

path = path.replace("'", "\\'") 
path = path.replace("(", "\\(") 
path = path.replace(")", "\\)") 
try: 
    os.system("%s %s 2>/dev/null &" % (appForExtension[extension], path)) 
except: 
    print "not opened" 

вы знаете, как Стандартно открыть файл с os.system() вызова избежать проблем с управляющими символами ли?

+0

Стоит отметить, вы можете использовать сырые строки ('г«\ '»'), чтобы избежать побега обратной косой черты. –

ответ

1

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

import subprocess 
res = subprocess.call([appForExtension[extension], path]) 

Документы для subprocess.call сказать:

subprocess.call = call(*popenargs, **kwargs) 
    Run command with arguments. Wait for command to complete, then 
    return the returncode attribute. 

... что вы заметите, удивительно похож на os.system, за исключением того, что subprocess.call избегает использования оболочки по умолчанию.

Перенаправление stderr остается в качестве упражнения для читателя ...

+0

Я использовал довольно * os.system() *, потому что я не хочу ждать завершения команды, поэтому я использую * & *, и я не хочу видеть сообщения об ошибках, поэтому я использую * 2>/dev/null/* – xralf

+0

... и вы можете выполнить то же самое, используя модуль 'subprocess'. Взгляните на документы; Думаю, вы найдете его гораздо более гибким. – larsks

+0

Когда я добавлю аргумент * stderr = "/ dev/null" * для перенаправления стандартного вывода ошибки, файл не откроется, и в документации я не вижу ничего о запуске в фоновом режиме. Если вы уверены в этом, исправьте мои аргументы правильно. – xralf

Смежные вопросы