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.
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
quel type d'autorisation a 'lighthttpd' sur votre machine – PradyJord