subprocess.check_call()与netsh一起返回1的问题

时间:2015-11-27 22:00:19

标签: python windows python-2.7 subprocess netsh

我正在尝试使用subprocess.check_call()和netsh来更改计算机的NIC卡设置。目前使用的是python 2.7和Windows7。

当我从cmd.exe运行它时,此命令成功:

netsh interface ip set address name="Local Area Connection" static 192.168.1.1 255.255.255.0 192.168.1.2

这个python脚本不成功:

import subprocess    
command = ['netsh','interface','ip','set','address','name="Local Area Connection"','static','192.168.1.1','255.255.255.0','192.168.1.2']
result = subprocess.check_call(command)

这是从上面的python脚本给出的回溯输出的最后一行:

CalledProcessError: Command '['netsh', 'interface', 'ip', 'set', 'address', 'name="Local Area Connection"', 'static', '192.168.1.1', '255.255.255.0', '192.168.1.2']' returned non-zero exit status 1

所以,有些事情显然是错的,我正在努力追查到底是什么。我想解决的第一件事是返回代码是什么意思?我希望我不会密集,但https://python.readthedocs.org/en/v2.7.2/library/subprocess.html#似乎无法解释返回码实际意味着什么。我确实找到了这个帖子What is the return value of subprocess.call()?,但它只给出了关于返回代码的一般性陈述。有人知道如何找出特定于subprocess.check_call()的返回码的含义吗?

这将有助于我开始排除故障,但如果有人对脚本失败的原因有任何想法,那将非常感激。我尝试使用"以管理员身份运行"打开cmd.exe,然后从那里运行python脚本,但结果是一样的。这个主题似乎是同一个问题,但我没有看到解决方案: Using subprocess.call() to pass commands to execute by cmd。我已尝试设置command = netsh interface ip set address name="Local Area Connection" static 192.168.1.1 255.255.255.0 192.168.1.2subprocess.check_call(command,shell=True)以及subprocess.check_call(shlex.split(command)),并且都返回代码' 1'。

2 个答案:

答案 0 :(得分:1)

返回代码基本上是程序通知调用系统程序执行成功状态的一种非常简单的方法。通常,返回代码0表示一切正常。其他号码被认为是错误。现在,程序可以决定对不同的问题使用不同的返回代码,然后提供一个返回代码的注册表意味着什么样的错误,但没有很多应用程序执行此操作。对于像netsh这样面向人类的程序来说,更常见的是使用任何错误的返回代码(通常是1),然后在程序输出中显示错误消息。

您应该使用catch_output来捕获netsh的输出,然后捕获异常并查看来自它的错误消息:

import subprocess    
command = ['netsh', 'interface', 'ip', 'set', 'address', 'name="Local Area Connection"', 'static', '192.168.1.1', '255.255.255.0', '192.168.1.2']

try:
    result = subprocess.check_output(command)
except subprocess.CalledProcessError as ex:
    print(ex.returncode, ex.output)
    raise

这应该在程序中止之前打印netsh的输出,因此netsh可能会告诉你出了什么问题。

如果我不得不猜测,我会说netsh抱怨缺少管理员权限。要更改网络接口的IP地址,需要升级。因此,如果您的Python程序没有以管理员身份运行,那么您生成的子进程也不会以管理员身份运行。

答案 1 :(得分:0)

似乎你错过了在命令行中转义引号字符,请尝试使用:

import subprocess    
command = ['netsh','interface','ip','set','address','name=\\"Local Area Connection\\"','static','192.168.1.1','255.255.255.0','192.168.1.2']
result = subprocess.check_call(command)