Windows 下如何通过 Python 脚本调用 cmd 命令并执行

1>问题来由:因为之前 vim 环境配置没有配好,所以才有了这个想法:通过脚本连续执行 cmd 命令。

2>问题描述:(附上代码)

import os
def command_line():
#os.system('cmd')
     cmd_path = [r"E:\tools\vim80-586w32\vim\vim80\vim.exe "]#列出源文件地址
     cmd_command = "cmd cd {0}".format(cmd_path)
     os.system(cmd_command)#通过 os 的命令来调用 cmd 的命令
#cmd = 'cmd cd {}'.format(source)
command_line()
#完成命令后的反馈
print('Successful the vim!')

3>在 bing 了一通无果之后,就思考,windows 下是否可以通过脚本连续执行 cmd 命令?另外有的话,可否告知其他方法?谢谢各位大 v 指点!!!


Windows 下如何通过 Python 脚本调用 cmd 命令并执行

12 回复

subprocess 模块 有带 session 支持的 交互式 执行系统内程序的功能

os.system() 太旧了


在Windows下用Python执行cmd命令,主要有三种方法,各有适用场景。下面给你完整的代码示例。

1. os.system() - 最简单直接

import os

# 执行单个命令
os.system('dir')  # 列出当前目录
os.system('echo Hello from cmd')  # 输出文本

# 执行多个命令(用&&连接)
os.system('cd C:\\ && dir')

2. subprocess.run() - 推荐使用,功能最全

import subprocess

# 基本执行,获取返回码
result = subprocess.run('ipconfig', shell=True, capture_output=True, text=True)
print(f"返回码: {result.returncode}")
print(f"输出内容:\n{result.stdout}")

# 执行带参数的命令
subprocess.run(['ping', '127.0.0.1', '-n', '3'], shell=True)

# 执行复杂命令(管道、重定向等)
cmd = 'dir | findstr ".py"'
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
print(result.stdout)

3. subprocess.Popen() - 需要交互或实时输出时用

import subprocess

# 实时获取输出
process = subprocess.Popen('ping 127.0.0.1 -n 5', 
                          shell=True,
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE,
                          text=True)

# 逐行读取输出
for line in process.stdout:
    print(f"实时输出: {line.strip()}")

# 等待命令完成
process.wait()
print(f"命令执行完毕,返回码: {process.returncode}")

实际应用示例 - 批量ping测试:

import subprocess
import concurrent.futures

def ping_host(host):
    """ping单个主机"""
    cmd = f'ping {host} -n 2 -w 1000'
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    
    if "TTL=" in result.stdout:
        return f"{host}: 在线"
    else:
        return f"{host}: 离线"

# 批量测试多个主机
hosts = ['127.0.0.1', '8.8.8.8', '192.168.1.1', '10.0.0.1']

# 使用线程池并发执行
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    results = list(executor.map(ping_host, hosts))

for result in results:
    print(result)

关键参数说明:

  • shell=True:通过系统的shell执行命令(Windows下就是cmd)
  • capture_output=True:捕获命令的输出
  • text=True:输出以字符串形式返回(否则是bytes)
  • stdout=subprocess.PIPE:将输出重定向到管道,便于程序读取

选择建议:

  • 简单命令用os.system()
  • 大多数情况用subprocess.run()
  • 需要实时交互用subprocess.Popen()

注意处理命令中的特殊字符和路径中的反斜杠,建议使用原始字符串或双反斜杠。

总结:subprocess.run()是最佳选择。

python popen 关键词你找找,应该有的

cd 到了 exeexe 文件上?

你这代码错误太多了,首先你直接 cd 到 exe 上去了,还有如果调用 cmd 命令, 需要后面加 \C 参数
比如 cmd /C dir c:\windows,还有 os.system 本身可以代表 cmd,也就是说你执行的代码前面不需要加 cmd,还有如果切换目录,可以直接用 python 本身的命令,然后再执行就行。。

先写个 bat 啊。

os.system(“cd E:\tools\vim80-586w32\vim\vim80 && start vim”)

第一个问题是:为什么不直接调用 vim 就好了?

第二个问题是 Windows 的每个盘符具有自己的 working directory,因此只是 cd 不会改变有效的 working directory (因为当前盘符或许不是 E:),一个安全的做法是使用 pushd E:\Path\To\Dir & start .\vim.exe & popd。

最后,如果你的全部目的是执行一些命令提示符处理的程序,可以换用 batch ——提示:batch 文件必须使用 CR LF。

cmd 的 cd 需要加参数,cd /d path, 执行命令或者外部程序需要加 /c, 简单点就写个 bat,调用 cmd 还是 powershell 随便你

因为之前我有直接通过 cmd 找到相应路径打开 vim,启动 exe 文件所以就直接把命令敲上去了。

谢谢指点,问题已解决!

谢谢指点,cd 不会改变有效的 working directory 这个涨姿势了。

回到顶部