2017-08-11 2 views
0

J'essaie d'utiliser la commande Popen du module sous-processus pour créer un espace de noms réseau. Il y a une différence dans la sortie que je vois de l'interpréteur et la sortie que je vois quand mon programme est exécuté à travers l'interface graphique (via une application lighthttpd).sous-processus popen ne pas exécuter de commande, code retour 1, espace de noms réseau

est ici la fonction simplifiée:

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()) 

Quand je lance ce code >>> addNamespace("b0ns") de l'interpréteur python, je reçois:

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

Cependant, quand je lance la même fonction du programme, je get:

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

La morue de retour e est ici 1 et l'espace de noms n'est pas ajouté. Quelle pourrait être la cause de son échec? Les privilèges root? J'ai essayé d'exécuter la commande avec l'ajout d'un sudo avant ip netns add.. mais cela n'a pas fonctionné.

J'ai essayé de donner l'argument shell=True dans le programme et a obtenu un return code = 255.

J'ai essayé d'utiliser les netns Module pour créer directement un espace de noms à l'aide netns.create() mais je reçois un OSError:mount rundir failed

détails du système : Python 2.7.5 CentOS 7.2

EDIT: J'ai ajouté la fonction à un fichier test.py simple et l'ai couru - cela a fonctionné bien. Il y a seulement un problème quand la fonction est invoquée par mon application basée sur l'interface graphique.

Répondre

0

Puisque vous n'avez pas ajouté beaucoup de détails sur la façon dont vous exécutez votre programme à partir de l'interface de ligne de commande, je fais une supposition.

Essayez d'utiliser:

sudo python <programname.py>

ip netns add NetworkName accès root nécessaire

ainsi vous devez fournir des accès à la racine de votre programme lors de l'exécution. Pourquoi son fonctionnement à partir de shell interactif !!! Eh bien, je suppose que vous avez ouvert votre shell interactif en tapant quelque chose comme suit:

sudo python

Vive !!

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) 

me donner:

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

Note: 'b1ns', 'b0ns' ajouté avec séries précédentes

+0

Oui, donc si je le lance à travers un programme régulier de la façon dont vous avez fait, cela fonctionne pour moi aussi. Cependant, ce code dans mon application est invoqué via un processus 'lighthttpd'. La vraie préoccupation est, pourquoi le code de retour pour le sous-processus est-il à 1? Est-ce que je peux déboguer pourquoi cette commande spécifique ne fonctionne pas? – Twix

+0

quel type d'autorisation a 'lighthttpd' sur votre machine – PradyJord