加载模块在运行时工作,除了在结构下

时间:2013-04-16 15:04:13

标签: python dynamic fabric

我在目录中有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:“python loader.py”我看到了:

Class1 running

您的期望是什么。如果我然后在fabric下运行它:“fab -f loader.py run”我看到了

Class1 running
Class1 running

Done.

哪个有意义,run()由Fabric和loader.py调用,当它由Fabric加载时。

但是,如果我删除了在loader.py中运行的显式调用,那么它只在fabric下调用一次,我得

ImportError: No module named mod1

为什么在布料下运行有所作为?有没有办法在面料下进行这项工作?

1 个答案:

答案 0 :(得分:2)

这是我的见解。

docs中引用了这种奇怪的行为,引用:

  

Fabric执行fabfile的正常导入(实际上是__import__)   为了访问其内容 - 它不进行任何评估或   类似。为了使其正常工作,Fabric暂时添加了找到的内容   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在加载fab文件时,结构如何使用导入进行操作。 this issue也是相关的。

希望有所帮助。