使用python运行cmd文件

2024-05-31 04:54:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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"

我正在尝试使用脚本运行这些命令,这样我就不必转到文件并单击它。 这是我的代码,它不会产生任何输出:

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

Tags: 文件命令cmdextractmediapandocmdfile1
2条回答

您不需要逐行读取cmd文件。您可以简单地尝试以下操作:

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

或者使用subprocess模块:

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通过在C中调用system()工作,在命令之后最多只能使用65533个参数(因此这是一个16位的问题)。再给出一个参数将导致返回代码32512 (which implies the exit code 127).

subprocess模块提供了更强大的工具,用于生成新进程并检索其结果;使用该模块比使用此函数(os.system('command'))更可取

因为它是一个命令文件(cmd),并且只有shell可以运行它,所以shell参数必须设置为true。由于要将shell参数设置为true,因此命令必须是字符串形式,而不是列表

使用Popen方法生成一个新进程,使用communicte等待该进程(您也可以超时)。如果您希望与子进程通信,请提供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()

相关问题 更多 >