我正试图使用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
所以,很明显出了问题,我正在努力找出原因。我想解决的第一件事是returncode是什么意思?我希望我不是很密集,但是https://python.readthedocs.org/en/v2.7.2/library/subprocess.html#似乎并没有解释returncode的实际含义。我确实找到了这个线程,subprocess.call()的返回值是多少?,但它只给出了关于一般返回代码的总括性语句。有人知道如何理解特定于subprocess.check_call()
的返回代码的含义吗?
这将帮助我开始进行故障排除,但如果有人对脚本最初失败的原因有任何想法,我们将不胜感激。我试过使用"以管理员身份运行"打开cmd.exe,然后从那里运行python脚本,但结果是一样的。这个帖子似乎是同一个问题,但我看不到解决方案:使用subprocess.call()传递命令以由cmd执行。我已经尝试设置command = netsh interface ip set address name="Local Area Connection" static 192.168.1.1 255.255.255.0 192.168.1.2
和subprocess.check_call(command,shell=True)
以及subprocess.check_call(shlex.split(command))
,并且两者都返回代码"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程序不是以管理员身份运行的,那么您派生的子流程也不是以管理员的身份运行的。
在命令行中似乎缺少转义引号字符,请尝试使用:
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)