subprocess popen不执行命令,返回代码1,网络命名空间
问题描述:
我试图使用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的应用程序调用该函数时,只有一个问题。
答
由于您没有在命令行界面上如何执行程序添加太多细节,所以我在猜测。
尝试使用:在执行
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']
注:添加先前运行
是啊
'b1ns', 'b0ns'
,所以如果我运行它通过一个常规的程序,你做的方式,它的工作对我来说太。但是,我的应用程序中的这段代码是通过'lighthttpd'进程调用的。真正的担忧是,为什么子进程的返回码设置为1?有没有办法可以调试为什么这个特定的命令不起作用? – Twix'lighthttpd'对你的机器有什么样的权限 – PradyJord