2017-08-11 438 views
0

我试图使用Popen命令从子进程模块创建一个网络命名空间。我从解释器看到的输出和我在通过GUI运行程序时看到的输出(通过lighthttpd应用程序)有所不同。subprocess popen不执行命令,返回代码1,网络命名空间

这里的简化功能:

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) 
[''] 

The return cod这里是1并且命名空间不会被添加。它可能导致它不能成功执行?根特权?我试图在ip netns add..之前加上sudo来执行命令,但那不起作用。

我试图给在程序中shell=True参数,并得到了return code = 255.

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

系统的详细资料:Python 2.7.5 CentOS 7.2

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

回答

0

由于您没有在命令行界面上如何执行程序添加太多细节,所以我在猜测。

尝试使用:在执行

sudo python <programname.py>

ip netns add NetworkName需要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) 

给予我:

[email protected]:~$ 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'] 

注:添加先前运行

+0

是啊'b1ns', 'b0ns',所以如果我运行它通过一个常规的程序,你做的方式,它的工作对我来说太。但是,我的应用程序中的这段代码是通过'lighthttpd'进程调用的。真正的担忧是,为什么子进程的返回码设置为1?有没有办法可以调试为什么这个特定的命令不起作用? – Twix

+0

'lighthttpd'对你的机器有什么样的权限 – PradyJord