我正在尝试使用子进程模块中的 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的应用程序调用函数时,只有一个问题。
答案 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'
添加了先前的运行