Python - модуль Fabric отсутствует внезапно

Я новичок в Python, и я экспериментирую с модулями fabric и matplotlib. Я создал виртуальный Env с помощью conda, и я пишу программы и выполняю внутри виртуального Env.

Я написал сценарий, который использует fabric.api (fabfile.py). Я импортирую этот fabfile в другой скрипт python (Window.py) и использую определение fabfile в Window.py. Все работает нормально, и я доволен.

Теперь я хотел построить графики для некоторых данных, извлеченных с помощью Fabric. поэтому я провел исследование и обнаружил, что matplotlib подходит для моей цели. Я установил этот модуль из conda внутри виртуального Env. поэтому, к моему удивлению, после того, как я установил это и запустил свой Window.py, я получаю следующее сообщение об ошибке!

**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**

вот мои образцы кода,

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)

когда я запускаю defs внутри fabfile, как показано ниже, все в порядке,

fab -a connect

но когда я вызываю Connect () из Window.py, все не работает, как до установки matplotlib

Я вижу вопрос, наиболее похожий на тот, который я задал здесь, по этой ссылке ниже

Ошибка импорта Python: нет модуля с именем Fabric.api?

Я не получил большой помощи от принятого ответа здесь, поскольку я не хочу использовать PIP сейчас, поскольку есть некоторая зависимость от моих окон с PIP, которая не решается. Я хочу использовать сам конду. Можно ли как-нибудь обойти эту проблему? заранее спасибо


person Vasanth Nag K V    schedule 24.10.2015    source источник


Ответы (1)


Я бы попытался сначала импортировать только те функции, которые необходимы из модулей, чтобы избежать проблем с пространством имен.

В вашем 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

И в вашем 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)

Также убедитесь, что PYTHONPATH совпадает при запуске fabfile и Window.py, поскольку PYTHONPATH - это то место, где Python будет искать модули для загрузки. Чтобы проверить это, поместите эту строку в начало ваших файлов:

import sys
print("PYTHONPATH:{0}".format(sys.path))
person charli    schedule 25.10.2015
comment
да ! это работал товарищ! но не могли бы вы объяснить, почему это сработало и что неправильно при импорте всех модулей с * в операторе импорта? - person Vasanth Nag K V; 25.10.2015
comment
Это происходит, когда функции с одинаковыми именами в разных модулях импортируются с *. Если вы импортируете только те функции, которые вам нужны, менее вероятно, что имена конфликтуют. Другой вариант - импортировать только модуль, поэтому функции будут иметь имя module.function (), и оно будет уникальным. - person charli; 25.10.2015