Запуск командного файла с подпроцессом - PullRequest
0 голосов
/ 24 октября 2018

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

import subprocess as sp
from pathlib import Path

file = Path(r'C:\Program Files (x86)\test.bat')

p = sp.Popen(['"' + str(file) + '"'], stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE,
             shell=True, universal_newlines=True)
outs, errs = p.communicate('', timeout=5)
print(outs, '\n-----\n', errs)

Я расширил это, добавив системный путь и изменив рабочий каталог:

import os
import sys

sys.path.append(file.parent)
os.chdir(file.parent)

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

Я также попробовал ее с исполняемым файлом, и возникла похожая ошибка: WinError 2: the system cannot find the file specified.Есть идеи, где я спотыкаюсь?


Попытки

  • Когда ключевое слово shell=True удалено, WinError 5 возвращается
  • Когда Popen вызывается с ['cmd'], а пакетный файл запускается с p.communicate('"' + str(file) + '"\n', timeout=5), ошибки не выдаются, и вывод содержит эхо-сигналы.Однако я полагаю, что пакетные файлы должны запускаться без явного открытия командной строки.

1 Ответ

0 голосов
/ 24 октября 2018

Используйте строку командной строки вместо списка аргументов при передаче shell=True или при запуске пакетного сценария со значением по умолчанию shell=False.

В Windows Popen обрабатывает список аргументов в командной строке, которая совместима с анализом аргументов VC ++.Но cmd.exe не использует правила разбора аргументов VC ++, и даже для исполняемого файла, который использует правила VC ++ (например, python.exe), добавляемые вами дополнительные кавычки (т. Е. '"' + str(file) + '"') экранируются обратным слешем как буквальная цитата.отметки в командной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...