Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用subprocess.call()传递命令以通过cmd执行_Python 2.7_Powershell_Cmd_Arguments_Subprocess - Fatal编程技术网

Python 2.7 使用subprocess.call()传递命令以通过cmd执行

Python 2.7 使用subprocess.call()传递命令以通过cmd执行,python-2.7,powershell,cmd,arguments,subprocess,Python 2.7,Powershell,Cmd,Arguments,Subprocess,我正在尝试将我的IP地址设置为LAN网络上的特定IP地址 为此,我尝试使用以下方法: import subprocess command='netsh interface ipv4 set address name="Local Area Connection* 4" source=static address=192.168.173.234 mask=255.255.255.0 gateway=192.168.0.1' subprocess.call(["cmd.exe", command])

我正在尝试将我的IP地址设置为LAN网络上的特定IP地址

为此,我尝试使用以下方法:

import subprocess
command='netsh interface ipv4 set address name="Local Area Connection* 4" source=static address=192.168.173.234 mask=255.255.255.0 gateway=192.168.0.1'
subprocess.call(["cmd.exe", command])
唯一的结果是启动一个空的cmd.exe,它什么也不做

另外,shell=True的用途是什么? 当我尝试使用它时,python返回一个SyntaxError

更新:如果我使用:

command='netsh interface ipv4 set address name="Local Area Connection* 4" source=static address=192.168.173.222 mask=255.255.255.0 gateway=192.168.0.1'
subprocess.check_call(["netsh.exe", command])
Python返回错误:

Traceback (most recent call last):
  File "D:file path", line 8, in <module>
    subprocess.check_call(["netsh.exe", netsh_cmd])
  File "C:\Python27\lib\subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)
CalledProcessError: Command '['netsh.exe', 'netsh interface ipv4 set address name="Local Area Connection* 4" source=static address=192.168.173.222 mask=255.255.255.0 gateway=192.168.0.1']' returned non-zero exit status 1

如果使用字符串参数,则需要shell=True:

您可以在不使用shell=True的情况下执行此操作,我建议通过传递参数列表:

import subprocess
command = ['netsh', 'interface', 'ipv4', 'set', 'address', 'name=Local Area Connection* 4', 'source=static', 'address=192.168.173.234', 'mask=255.255.255.0', 'gateway=192.168.0.1']


subprocess.call( command)
或者让我们为您拆分参数:

import shlex

subprocess.call(shlex.split(command))
使用check_call代替call可能更可取,因为如果存在check_call将出现的非零退出状态,则call不会引发错误。

如果假设您在Windows上,则可以按原样传递命令字符串:

import subprocess

subprocess.check_call(command)

@马里奥。那么到底发生了什么呢?现在我已经尝试使用check_call python返回一个被调用的进程错误:命令“['netsh',…]”返回非零退出状态1是的,它可以正常工作,但前提是有另一台计算机连接到我在试图设置特定IP的机器上创建的网络。@J.F.Sebastian,我最初按原样使用该命令,您可以在第一个示例中看到它,OP说它不起作用。shell=True会使它失败吗?@padraiccnningham:在这种情况下,它不应该失败,除非有其他冲突的netsh程序。转义规则也不同,但它不应该针对给定的命令。可能会转换为其两个补码的负值。您在Windows上吗?为什么使用单引号?如果将命令按原样复制粘贴到运行cmd.exe而不是Powershell的Windows控制台中,是否有效?netsh是如何实现的-netsh.exe在哪里?或者它不太可能是一个内部cmd.exe命令?@J.F.Sebastian,我在Windows 8.1上,更改了单引号。我不知道它在cmd中不起作用。是的,如果我在cmd中输入我在这里所说的内容,它确实可以工作。exe必须作为admin/Power shell运行。netsh.exe在C:/Windows/System32/中。是否尝试以管理员身份运行建议的Python代码以进行调试?callcommand或callcommand,shell=True@J.F.Sebastian如何以管理员身份运行python代码?使用“/user:Administrator”以与运行netsh命令完全相同的方式运行它进行调试,该命令成功地打开管理控制台并在那里运行Python脚本。如果有效;您可以寻找适当的方法来升级权限。关于最后一个错误:不要从命令的其余部分拆分netsh。按照我的回答,将命令作为单个字符串传递,就像在命令行中看到的一样。
import subprocess

subprocess.check_call(command)