我想扩展一下Windows解决方案。在Python 2.7.5中使用IDLE时,当我从Expts.py文件运行此代码时:import subprocess

r = subprocess.check_output('cmd.exe dir',shell=False)

print r

…在Python Shell中,我只得到对应于“cmd.exe”的输出;“dir”部分被忽略。但是,当我添加/K或/C这样的开关时。。。import subprocess

r = subprocess.check_output('cmd.exe /K dir',shell=False)

print r

…然后在Python Shell中,我得到了我所期望的所有内容,包括目录列表。呜呼!

现在,如果我在DOS Python命令窗口中尝试任何相同的操作,不使用开关,或者使用/K开关,它似乎会使窗口挂起,因为它正在运行一个子进程cmd.exe,并等待进一步的输入-键入“exit”,然后按[回车]释放。但是使用/K开关,它可以完美地工作,并返回到python提示符。那好吧。

更进一步…我觉得这很酷…当我在Expts.py中这样做时:import subprocess

r = subprocess.call("cmd.exe dir",shell=False)

print r

…一个新的DOS窗口弹出并保持在那里,只显示“cmd.exe”的结果,而不是“dir”。当我添加/C开关时,DOS窗口会在我看到任何东西之前快速打开和关闭(正如预期的那样,因为/C在完成时终止)。相反,当我添加/K开关时,DOS窗口会弹出并保持打开状态,我会得到我期望的所有输出,包括目录列表。

如果我在DOS Python命令窗口中尝试相同的操作(subprocess.call而不是subprocess.check_output);所有输出都在同一窗口中,则没有弹出窗口。如果没有开关,“dir”部分将再次被忽略,提示将从python提示符变为DOS提示符(因为一个cmd.exe子进程正在python中运行;再次键入'exit',您将返回python提示符)。添加/K开关会打印出目录列表,并将提示从python更改为DOS,因为/K不会终止子进程。将开关更改为/C将提供预期的所有输出并返回到python提示符,因为子进程根据/C终止

抱歉,冗长的回答让我很失望,但在这个委员会上,许多简洁的“答案”充其量是行不通的(似乎是因为它们没有经过测试——就像我上面的Eduard F的回答缺少开关一样),或者更糟的是,它们太过简洁,根本没有多大帮助(例如,“尝试子流程而不是os.system”。。。是的,好吧,现在怎么办??)。相反,我提供了我测试过的解决方案,并展示了它们之间的细微差别。花了很多时间但是。。。

希望这有帮助。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐