Проблемы с использованием subprocess.call () в Python 2.7.2 в Windows - PullRequest
11 голосов
/ 02 марта 2012

Я пытаюсь сделать следующее, и это не удалось с ошибкой. Я попытался запустить его из оболочки Python / из скрипта / на консоли Windows, вызвав Python на консоли. Ничто не похоже на работу. Всегда одна и та же ошибка.

from subprocess import call
>>>pat = "d:\info2.txt"

>>> call(["type",pat])

>>>Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    call(["type",pat])
  File "C:\Python27\lib\subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "C:\Python27\lib\subprocess.py", line 679, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 893, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

Кто-нибудь знает, что здесь не так? !! ???

даже простой call(["date"]] без каких-либо аргументов также завершается с той же ошибкой.

Я использую: 32-битная версия Python 2.72 на компьютере с Windows 7.

Ответы [ 4 ]

19 голосов
/ 02 марта 2012

Добавить shell=True к вызову :

>>> import subprocess
>>> subprocess.call('dir', shell=True)
0

Как видите, в качестве значения он возвращает код возврата, а не вывод dir.Кроме того, она ожидает завершения команды, поэтому

>>> subprocess.call('date', shell=True)

будет ждать ввода новой даты.

edit: Если вы хотите захватитьвывод, используйте subprocess.check_output.Например, команда DOS type выводит содержимое файла.Итак, предположим, что ваш файл info2.txt содержит ваше имя пользователя, вы должны сделать:

>>> import subprocess
>>> path = r'd:\info2.txt'
>>> output = subprocess.check_output(['type', path], shell=True)
>>> print output
Vinu

Для всех способов вызова внешних команд в Python см. Этот подробный обзор соответствующего вопроса , подробнее о subprocess, см. эту статью Дуга Хеллмана .

4 голосов
/ 02 марта 2012

Команда 'type' не выполняется, потому что это внутренняя команда - внутренняя для интерпретатора команд / оболочки с именем CMD.EXE. Вместо этого вы должны вызвать «имя файла cmd.exe». Точный код:

call(['cmd','/C type abc.txt'])
1 голос
/ 02 марта 2012
pat = "d:\info2.txt"

В Python и большинстве других языков программирования \ является escape-символом, который не включается в строку, если не удвоен.Либо используйте необработанную строку, либо экранируйте escape-символ:

pat = "d:\\info2.txt"
0 голосов
/ 02 марта 2012

Escape \ с \\:

pat = "d:\\info2.txt"

или использование «сырых» строк:

pat = r"d:\info2.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...