2016-11-12 2 views
0

Я пишу сценарий, чтобы открыть notepad.exe с помощью subprocess.Popen()subprocess.Popen и относительные каталоги

import subprocess 
command = '%windir%\system32\\notepad.exe' 
process = subprocess.Popen(command) 
output = process.communicate() 
print(output[0]) 

Это бросает FileNotFoundError

Можно ли изменить/добавить к вышесказанному чтобы заставить его работать с относительными путями? Я попытался запустить скрипт из C: \ Windows> после его перемещения, который снова не удался. Также установите shell = True, но также не удалось. Написание аналогичного скрипта с помощью os.popen() работает нормально с относительными путями, независимо от того, в какой директории запущен скрипт, но насколько я понимаю, popen - это не путь вперед.

Ранние шаги в мире программирование/Python. Любой вход очень ценится.

ответ

0

Использование os.path.expandvars расширить %windir%:

command = os.path.expandvars('%windir%\\system32\\notepad.exe') 

В результате путь, который затем может быть передан в subprocess.Popen.

subprocess.Popen не включает переменные среды, такие как %windir%. Оболочка может, но вы действительно не должны зависеть от shell=True.

1

Pro tip: всякий раз, когда вы получаете сообщение об ошибке, запрашиваете систему для выполнения команды, распечатайте команду (и, если применимо, текущий рабочий каталог). Результаты часто будут удивлять вас.

В вашем случае, я подозреваю, что у вас просто отсутствует обратная косая черта. Используйте вместо этого:

command = '%windir%\\system32\\notepad.exe' 

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

HTH.

+0

Спасибо за подсказку. Я попробовал оба, с \ или \\ перед system32, но печать была такой же. – mdn

0

Вы можете использовать необработанные строки, чтобы избежать дублирования обратной косой черты.

command = r'%windir%\system32\notepad.exe' 
+0

Спасибо. Знаете ли вы, что это так же используется в пандах? Как и в DataFrame.index = DataFrame.index.str.replace (r '(string_to_replace', 'new_string')? Я думал, что он запустил регулярные выражения .. но теперь я думаю, что он просто обозначает необработанные строки, как вы писали. выражения в виде DataFrame.index.str.replace (r '(\ s \. * \)', 'new_string'), следовательно, путаница. – mdn

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