2015-10-24 1 views
1

Je suis nouveau à python et j'expérimente avec des modules de tissu et matplotlib. J'ai créé un Env virtuel avec conda et je suis en train d'écrire des programmes et d'exécuter à l'intérieur de l'Env. J'ai écrit un script qui utilise fabric.api (un fabfile.py). J'importe ce fabfile dans un autre script python (Window.py) et en utilisant la définition dans fabfile dans Window.py. Tout fonctionne bien et je suis heureux.Python - module de tissu manquant tout à coup

Maintenant, je voulais tracer des graphiques sur certaines données que j'ai extrait en utilisant Fabric. J'ai donc fait une recherche et trouvé matplotlib était adapté à mon but. J'ai installé ce module à partir de conda à l'intérieur de l'Env. donc à ma grande surprise une fois que j'ai installé ceci et a couru mon Window.py, je reçois ceci ci-dessous montré Erreur!

**Traceback (most recent call last): 
    File "Window.py", line 9, in <module> 
    from fabfile import * 
    File "F:\home\WorkSpace\FIrstPyProject\TestModules\fabfile.py", line 2, in <module> 
    from fabric.api import * 
ImportError: No module named fabric.api** 

voici mes exemples de code,

Fabfile.py

from fabric.api import * 

import sys 
def hello(): 
    print "hello world" 

def connect(commandInput): 
    print "starting to connect" 
    env.host_string = '[email protected]' 
    env.password = "nms" 
    with hide('output','running'): 
     p=run(commandInput) 
     return p 

Window.py

import Tkinter as tk 
import csv 
import MasterWindow 
from fabfile import * 
import time 
from fabric.api import * 

LARGE_FONT= ("Verdana", 12) 
env.host_string = '[email protected]' 
env.password = "nms" 

class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent)  
     label = tk.Label(self, text="Graphy-Home", font=LARGE_FONT)  
     label.pack(pady=10,padx=10)  
     Command = tk.Label(self, text="Enter Command")  
     pickCommand = tk.Entry(self)   
     pickCommand.pack(pady=10)   
     Command.pack() 
     button1 = tk.Button(self, text="Submit Command", command=lambda: submit())  
     button1.pack() 

    def submit(ItrCnt=0,sleepTime=3): 
     while (ItrCnt < 10): 
      print (pickCommand.get()) 
      cmd=pickCommand.get() 
      ItrCnt=ItrCnt+1 
      time.sleep(sleepTime) 
      p=connect(cmd)    
      print(p.stdout) 

quand je lance les defs à l'intérieur fabfile de la manière indiquée ci-dessous, les choses vont bien,

fab -a connect 

mais quand je fais appel Connect() des choses Window.py ne fonctionnent pas comme avant l'installation de matplotlib

je vois une question plus semblable à celui que j'ai demandé ici dans ce lien ci-dessous

Je dint obtenir beaucoup d'aide de la réponse acceptée ici car je ne veux pas utiliser PIP maintenant car il y a une certaine dépendance sur mes fenêtres avec PIP qui n'est pas résolue. Je veux utiliser la conda elle-même. Y at-il de toute façon je peux contourner ce problème? merci d'avance

Répondre

0

Je voudrais d'abord essayer d'importer uniquement les fonctions nécessaires à partir des modules, pour éviter les problèmes avec l'espace de noms.

Dans votre fabfile:

from fabric.api import env,hide,run 

import sys 
def hello(): 
    print "hello world" 

def connect(commandInput): 
    print "starting to connect" 
    env.host_string = '[email protected]' 
    env.password = "nms" 
    with hide('output','running'): 
     p=run(commandInput) 
     return p 

Et dans votre Windows.py:

import Tkinter as tk 
import csv 
import MasterWindow 
from fabfile import connect 
import time 
from fabric.api import env 

LARGE_FONT= ("Verdana", 12) 
env.host_string = '[email protected]' 
env.password = "nms" 

class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent)  
     label = tk.Label(self, text="Graphy-Home", font=LARGE_FONT)  
     label.pack(pady=10,padx=10)  
     Command = tk.Label(self, text="Enter Command")  
     pickCommand = tk.Entry(self)   
     pickCommand.pack(pady=10)   
     Command.pack() 
     button1 = tk.Button(self, text="Submit Command", command=lambda: submit())  
     button1.pack() 

    def submit(ItrCnt=0,sleepTime=3): 
     while (ItrCnt < 10): 
      print (pickCommand.get()) 
      cmd=pickCommand.get() 
      ItrCnt=ItrCnt+1 
      time.sleep(sleepTime) 
      p=connect(cmd)    
      print(p.stdout) 

Aussi, assurez-vous que le PYTHONPATH est le même lors de l'exécution fabfile et Window.py, comme PYTHONPATH est où Python va chercher des modules à charger. Pour le vérifier, mettez cette ligne au début de vos fichiers:

import sys 
print("PYTHONPATH:{0}".format(sys.path)) 
+0

oui! cela a fonctionné mate! mais cela vous dérange-t-il d'expliquer pourquoi cela a fonctionné et est erroné en important tous les modules avec * dans la déclaration d'importation? –

+0

Cela se produit lorsque des fonctions portant le même nom dans différents modules sont importées avec *. Si vous importez uniquement les fonctions dont vous avez besoin, il est moins probable que les noms se rencontrent. Une autre option consiste à importer uniquement le module, donc les fonctions auront le nom de module.function(), et ce sera unique. – charli