subprocess popen不执行命令,返回代码1,网络命名空间

时间:2017-08-11 09:38:39

标签: python networking network-programming subprocess

我正在尝试使用子进程模块中的 Popen 命令来创建网络命名空间。我从解释器看到的输出和我通过GUI(通过lighthttpd应用程序)运行程序时看到的输出有所不同。

这是简化的功能:

import subprocess
from pyroute2 import netns
def addNamespace(namespace):
    setNs = "ip netns add %s"%(namespace)
    print(setNs)
    proc = subprocess.Popen(setNs.split(' '))
    ret = proc.communicate()
    print("Return Code:%d STDOUT/STDERR:%s"%(proc.returncode, str(ret)))
    print(netns.listnetns())

当我从python解释器运行此代码>>> addNamespace("b0ns")时,我得到:

ip netns add b0ns
Return Code:0 STDOUT/STDERR:(None, None)
['b0ns']

但是,当我从程序中运行相同的函数时,我得到:

ip netns add b0ns
Return Code:1 STDOUT/STDERR:(None, None)
['']   

这里的返回代码是1 ,并且没有添加命名空间。可能是什么原因导致它没有成功执行? root权限?我尝试在sudo之前添加 ip netns add.. 来执行命令,但这不起作用。

我尝试在程序中提供shell=True参数并获得return code = 255.

我尝试使用 netns 模块使用netns.create()直接创建命名空间,但收到OSError:mount rundir failed

系统详细信息:Python 2.7.5 CentOS 7.2

修改: 我将该函数添加到一个简单的test.py文件并运行它 - 它工作正常。通过基于GUI的应用程序调用函数时,只有一个问题。

1 个答案:

答案 0 :(得分:0)

由于您没有从命令行界面添加有关如何执行程序的详细信息,所以我在猜测。

尝试使用:

sudo python <programname.py>

ip netns add NetworkName需要root访问权限

所以你必须在执行时提供对程序的root访问。

为什么它从交互式shell开始工作!!!好吧,我想你必须通过输入以下内容打开你的交互式shell:

sudo python

干杯!!

import subprocess
from time import sleep
from pyroute2 import netns
def addNamespace(namespace):
    setNs = "ip netns add %s"%(namespace)
    print(setNs)
    proc = subprocess.Popen(setNs.split(' '))
    ret = proc.communicate()
    print("Return Code:%d STDOUT/STDERR:%s"%(proc.returncode, str(ret)))
    print(netns.listnetns())


addNamespace('b2ns')
if __name__ == '__main__':
    addNamespace('b3ns')
    sleep(3)

给我:

pradeep@localVM:~$ sudo python add_network.py
ip netns add b2ns
Return Code:0 STDOUT/STDERR:(None, None)
['b2ns', 'b1ns', 'b0ns']
ip netns add b3ns
Return Code:0 STDOUT/STDERR:(None, None)
['b3ns', 'b2ns', 'b1ns', 'b0ns']

注意:'b1ns', 'b0ns'添加了先前的运行