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: "python loader.py" 我看到:

Class1 running

这是你所期望的。如果我然后在结构下运行它:“fab -f loader.py run”我看到

Class1 running
Class1 running

Done.

这是有道理的,run() 由fabric AND loader.py 在fabric 加载时调用。

但是,如果我删除了在 loader.py 中运行的显式调用,因此它只在结构下调用一次,我得到

ImportError: No module named mod1

为什么在织物下跑步会有所不同?有没有办法在织物下进行这项工作?

4

1 回答 1

2

这是我的见解。

这种奇怪的行为在docs中进行了解释,引用:

Fabric 对您的 fabfile 进行正常导入(实际上是 __import__)以访问其内容——它不执行任何 eval-ing 或类似操作。为了使其工作,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()

看起来很难看,但它解决了问题。

这是在加载 fab 文件时,fabric 如何使用导入进行操作。这个问题也很重要。

希望有帮助。

于 2013-04-25T13:36:45.020 回答