Windows下使用Subprocess Popen调用pushd命令的问题求助
解决Windows下subprocess调用pushd/dir/popd无输出的问题
嘿,太懂这种卡半天找不到问题点的憋屈感了!你遇到的核心问题其实是Windows的shell内置命令不能直接用subprocess.Popen调用——pushd、dir、popd都是cmd.exe自带的内置命令,不是独立的可执行文件,直接调用它们系统根本找不到对应的程序,自然没输出。
下面给你拆解解决方案:
为什么原代码无效?
你的代码subprocess.Popen([r"pushd", r"C:\MishaMachine"], ...)是在尝试启动一个名为pushd.exe的程序,但Windows里根本没有这个独立程序,pushd是cmd.exe内置的命令。所以这个进程其实启动失败了,后续的communicate('dir')也完全没作用。
正确的实现方式
要执行shell内置命令,必须通过cmd.exe来调用,而且要保证所有相关命令(pushd、dir、popd)都在同一个cmd进程里执行——因为每个subprocess进程都是独立的,进程间的目录切换不会互相影响。
方式1:一次性执行所有命令(最简洁)
用cmd /c参数让cmd执行完一串命令后自动退出,多个命令用&&连接:
import subprocess # 一次性执行pushd、dir、popd result = subprocess.run( ["cmd.exe", "/c", "pushd C:\\MishaMachine && dir && popd"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print("目录内容:") print(result.stdout) if result.stderr: print("错误信息:") print(result.stderr)
方式2:用communicate交互式发送命令
如果你需要分步发送命令(比如动态决定下一步执行什么),可以启动一个持续运行的cmd进程,通过stdin依次发送命令:
import subprocess # 启动cmd进程,开启文本模式的管道 p = subprocess.Popen( ["cmd.exe"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1 # 行缓冲,方便实时输出(可选) ) # 发送命令,每个命令后要加换行符,最后用exit退出cmd commands = """pushd C:\\MishaMachine dir popd exit """ # 发送命令并获取输出 stdout, stderr = p.communicate(commands) print("执行结果:") print(stdout) if stderr: print("错误提示:") print(stderr)
关于popd的说明
当然可以用popd返回原目录,但必须和pushd在同一个cmd进程里执行——如果分开启动两个subprocess,第一个进程的pushd不会影响第二个进程的目录,自然popd也没用。上面两种方式都满足这个要求,执行popd后会回到cmd初始的工作目录。
额外提示
- 用
text=True(Python 3.7+)可以直接处理字符串,不用手动编码解码字节流,更方便。 - 如果需要实时获取输出(而不是等所有命令执行完),可以不用
communicate,而是直接读写p.stdin和p.stdout,但要注意处理缓冲问题。
内容的提问来源于stack exchange,提问作者UCProgrammer
相关产品推荐
相关产品推荐

