2013-04-16 41 views
1

我在一个目录中有2个文件:loader.py & mod1.py. Loader.py动态地在mod1.py中创建一个类并在其上调用一个方法。这里是mod1.py加载模块在运行时工作除织物外

class MyClass1: 
     def run(self): 
      print "Class1 running" 

这里是装载机:

def run(): 
     mod = __import__('mod1') 
     cls = getattr(mod, 'MyClass1') 
     inst = cls() 
     inst.run() 

    run() 

如果我跑这只是简单的Python: “巨蟒loader.py” 我看到:

Class1 running 

这是什么你的期望。如果我然后运行它布下的“FAB -f loader.py运行”我看到

Class1 running 
Class1 running 

Done. 

这是有道理的,run()是由面料和loader.py当它是由面料加载调用。

但是,如果我删除显式调用在loader.py运行,因此它的下一次仅面料叫,我得到

ImportError: No module named mod1 

为什么布下运行有所作为?有没有办法使这项工作在织物之下?

+0

是否有助于将__init__.py文件添加到目录中? –

+0

仅仅存在__init__.py文件没有任何区别。 –

+0

答案最终有所帮助吗?谢谢。 – alecxe

回答

2

这是我的见解。

这种怪异的行为是docs解释,报价:

面料做才能访问其内容的fabfile 的正常进口(实际上是一个__import__) - 它没有做任何EVAL-ING或 相似。为了使这项工作,面料临时增加了发现 fabfile的包含文件夹添加到Python负载路径(并将其删除 随即。)

看看修改后的loader.py

import os 
import sys 

print sys.path # current dir is in sys.path 

def run(): 
    print sys.path # current dir is NOT in sys.path 

    # no problem - we'll just add it 
    sys.path.insert(0, os.path.dirname(os.path.realpath(__file__))) 

    mod = __import__('mod1') 
    cls = getattr(mod, 'MyClass1') 
    inst = cls() 
    inst.run() 

外貌丑陋,但它解决了这个问题。

Here's fabric如何在加载fab文件时使用导入操作。还有this issue是相关的。

希望有所帮助。

相关问题