63

我们如何使用 Python 与 OS shell 交互?我想通过 python 运行 windows cmd 命令。如何实现?

4

6 回答 6

93

更新的subprocess.check_output和类似的命令应该替换os.system. 有关详细信息,请参阅此页面。虽然我无法在 Windows 上对此进行测试(因为我无权访问任何 Windows 机器),但以下应该可以工作:

from subprocess import check_output
check_output("dir C:", shell=True)

check_output从您的命令返回一个输出字符串。或者,subprocess.call只需运行命令并返回命令的状态(如果一切正常,通常为 0)。

另请注意,在 python 3 中,该字符串输出现在已bytes输出。如果要将其更改为字符串,则需要类似

from subprocess import check_output
check_output("dir C:", shell=True).decode()

如有必要,您可以告诉它您的程序输出的编码类型。默认值为utf-8,通常可以正常工作,但此处有其他标准选项。

另请注意,@bluescorpion 在评论中说 Windows 10 需要尾部反斜杠,如check_output("dir C:\\", shell=True). 需要双反斜杠,因为\它是python中的特殊字符,所以必须转义。(另请注意,即使在字符串的最后一个字符前面加上前缀r也无济于事-是语法错误,但不是。)\r"dir C:\"r"dir C:\ "

于 2013-02-15T15:41:09.587 回答
19

您将使用 os 模块系统方法

你只要输入命令的字符串形式,返回值就是windows环境变量COMSPEC

例如:

os.system('python') 打开 windows 命令提示符并运行 python 解释器

os.system('python') 示例

于 2013-02-15T15:17:58.587 回答
19

重构@srini-beerge 的答案,得到输出和返回码

import subprocess
def run_win_cmd(cmd):
    result = []
    process = subprocess.Popen(cmd,
                               shell=True,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
    for line in process.stdout:
        result.append(line)
    errcode = process.returncode
    for line in result:
        print(line)
    if errcode is not None:
        raise Exception('cmd %s failed, see above for details', cmd)
于 2016-12-09T20:00:58.727 回答
8

简单导入 os 包并运行以下命令。

import os
os.system("python test.py")
于 2020-01-07T10:43:10.433 回答
6

您可以使用subprocess带有以下代码的包:

import subprocess
cmdCommand = "python test.py"   #specify your cmd command
process = subprocess.Popen(cmdCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
print output
于 2017-04-24T06:39:17.840 回答
1
import subprocess
result = []
win_cmd = 'ipconfig'(curr_user,filename,ip_address)
process = subprocess.Popen(win_cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE )
for line in process.stdout:
    print line
result.append(line)
errcode = process.returncode
for line in result:
    print line
于 2016-10-04T10:52:13.617 回答