我在目录中有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
为什么在布料下运行有所作为?有没有办法在面料下进行这项工作?
答案 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也是相关的。
希望有所帮助。