Запустите cmd файл, используя python - PullRequest
0 голосов
/ 14 июля 2020

У меня есть cmd-файл "file.cmd", содержащий 100 командных строк.

Пример

 pandoc --extract-media -f docx -t gfm "sample1.docx" -o "sample1.md"
 pandoc --extract-media -f docx -t gfm "sample2.docx" -o "sample2.md"
 pandoc --extract-media -f docx -t gfm "sample3.docx" -o "sample3.md"

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

file1 = open('example.cmd', 'r') 
Lines = file1.readlines()
# print(Lines)
for i in Lines:
    print(i)
    os.system(i)

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Модуль subprocess предоставляет более мощные средства для создания новых процессов и получения их результатов; использование этого модуля предпочтительнее, чем использование этой функции (os.system('command')).

, поскольку это командный файл (cmd), и только оболочка может запускать его, тогда аргумент оболочки должен иметь значение true. поскольку вы устанавливаете для аргумента оболочки значение true, команда должна иметь строковую форму, а не список.

используйте метод Popen для создания нового процесса и сообщения для ожидания этого процесса (вы можете тайм-аут). если вы используете sh для связи с дочерним процессом, укажите PIPES (см. пример mu, но вам это необязательно!)

код ниже для python 3.3 и выше

import subprocess

try:
    proc=subprocess.Popen('myfile.cmd', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    outs, errs = proc.communicate(timeout=15)  #timing out the execution, just if you want, you dont have to!
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

для более старых python версий

proc = subprocess.Popen('myfile.cmd', shell=True)
t=10
while proc.poll() is None and t >= 0:
    print('Still waiting')
    time.sleep(1)
    t -= 1

proc.kill()

В обоих случаях (python версии), если вам не нужна функция timeout и вам не нужно взаимодействовать с дочерним процессом, тогда просто используйте:

proc = subprocess.Popen('myfile.cmd', shell=True)
proc.communicate()
0 голосов
/ 14 июля 2020

Вам не нужно читать cmd-файл построчно. вы можете просто попробовать следующее:

import os
os.system('myfile.cmd')

или используя подпроцесс модуль:

import subprocess
p = subprocess.Popen(['myfile.cmd'], shell = True, close_fds = True)
stdout, stderr = proc.communicate()

Пример:

myfile. cmd :

@ECHO OFF
ECHO Grettings From Python!
PAUSE

script.py :

import os
os.system('myfile.cmd')

cmd откроется с:

Greetings From Python!
Press any key to continue ...

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

import os
return_code=os.system('myfile.cmd')
assert return_code == 0 #asserts that the return code is 0 indicating success!

Примечание: os.system работает, вызывая system() в C, может принимать только до 65533 аргументов после команды (поэтому это 16-битная проблема). Если указать еще один аргумент, будет получен код возврата 32512 (which implies the exit code 127).

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