Fabric导入错误:“fab任务”与“来自fabfile导入任务; task()”

时间:2015-04-23 03:39:34

标签: python encapsulation fabric python-import

这也与Python的导入机制有关,特别是在函数内部使用import。 使用Python 2.7.9和Fabric 1.10.0,创建以下三个文件:

fabfile.py:

from another import another_hello
def hello():
    print 'hello, world'
    another_hello()

another.py:

def another_hello():
    from secret import TEXT

    print 'Hello, world!'
    print 'text: ' + TEXT

secret/__init__.py:(还可以创建文件夹secret/

TEXT = 'secret'

现在尝试fab hello。它抱怨道:

  File "/home/sergey/projects/Bask/service/t/fabfile.py", line 4, in hello
    another_hello()
  File "/home/sergey/projects/Bask/service/t/another.py", line 2, in another_hello
    from secret import TEXT
ImportError: No module named secret

同时,您可以轻松启动翻译并输入 from fab import hello; hello()。完美运作:

In [2]: from fabfile import hello; hello() 
hello, world
Hello, world!
text: secret

为什么会出现这种差异?

现在,我找到了一个让这项工作成功的黑客。只需在import secret的开头添加fabfile.py即可。我认为当fab工具打开PYTHONPATH以查找特定任务时,fabfile.py工具仅适用fabfile.py,但一旦导入任务并开始实际运行,然后有些东西发生了变化,因此它无法再访问原始文件夹。

我的黑客可以走了吗?但是它不会破坏封装,说到最后,因为import应该知道它调用的任何函数或方法的所有间接依赖?也许这是反对函数内*** First throw call stack: ( 0 CoreFoundation 0x02004746 __exceptionPreprocess + 182 1 libobjc.A.dylib 0x004eea97 objc_exception_throw + 44 2 CoreFoundation 0x0200466d +[NSException raise:format:] + 141 3 UIKit 0x00a76e2f -[UINib instantiateWithOwner:options:] + 1003 4 UIKit 0x00891124 -[UIViewController _loadViewFromNibNamed:bundle:] + 270 5 UIKit 0x008918bb -[UIViewController loadView] + 295 6 UIKit 0x00891aef -[UIViewController loadViewIfRequired] + 78 7 UIKit 0x00892095 -[UIViewController view] + 35 8 UIKit 0x008e1d2f -[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:] + 426 9 UIKit 0x008e136f -[UITabBarController transitionFromViewController:toViewController:] + 64 10 UIKit 0x008dd52b -[UITabBarController _setSelectedViewController:] + 339 11 UIKit 0x008dd2e5 -[UITabBarController setSelectedIndex:] + 115 12 UIKit 0x008dce91 __51-[UITabBarController _setViewControllers:animated:]_block_invoke394 + 43 13 UIKit 0x007b6d4f +[UIView(Animation) performWithoutAnimation:] + 82 14 UIKit 0x008dcd3d -[UITabBarController _setViewControllers:animated:] + 3627 15 UIKit 0x008db403 -[UITabBarController _updateLayoutForTraitCollection:] + 302 16 UIKit 0x008dae73 __80-[UITabBarController willTransitionToTraitCollection:withTransitionCoordinator:]_block_invoke + 69 17 UIKit 0x00c36107 -[_UIViewControllerNullAnimationTransitionCoordinator _applyBlocks:releaseBlocks:] + 198 18 UIKit 0x00c35d9a -[_UIViewControllerNullAnimationTransitionCoordinator _runAlongsideAnimations] + 148 19 UIKit 0x008af063 -[UIViewController(UIContainerViewControllerProtectedMethods) setOverrideTraitCollection:forChildViewController:] + 399 20 UIKit 0x00c1fa10 -[UISplitViewController _setMasterOverrideTraitCollectionActive:] + 127 21 UIKit 0x00c1b35a -[UISplitViewController initWithCoder:] + 112 22 UIKit 0x00bfa92e UINibDecoderDecodeObjectForValue + 739 23 UIKit 0x00bfa643 -[UINibDecoder decodeObjectForKey:] + 371 24 UIKit 0x00a77c1a -[UIRuntimeConnection initWithCoder:] + 189 25 UIKit 0x00bfa92e UINibDecoderDecodeObjectForValue + 739 26 UIKit 0x00bfab30 UINibDecoderDecodeObjectForValue + 1253 27 UIKit 0x00bfa643 -[UINibDecoder decodeObjectForKey:] + 371 28 UIKit 0x00a76ed0 -[UINib instantiateWithOwner:options:] + 1164 29 UIKit 0x00d34185 -[UIStoryboard instantiateViewControllerWithIdentifier:] + 220 30 UIKit 0x00d34301 -[UIStoryboard instantiateInitialViewController] + 74 31 UIKit 0x0072c6fc -[UIApplication _loadMainStoryboardFileNamed:bundle:] + 79 32 UIKit 0x0072c984 -[UIApplication _loadMainInterfaceFile] + 245 33 UIKit 0x0072b2f4 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1337 34 UIKit 0x0074493e __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59 35 UIKit 0x0072a04a -[UIApplication workspaceDidEndTransaction:] + 155 36 FrontBoardServices 0x031c7c9e __37-[FBSWorkspace clientEndTransaction:]_block_invoke_2 + 71 37 FrontBoardServices 0x031c772f __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 54 38 FrontBoardServices 0x031d9d7c __31-[FBSSerialQueue performAsync:]_block_invoke_2 + 30 39 CoreFoundation 0x01f26050 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16 40 CoreFoundation 0x01f1b963 __CFRunLoopDoBlocks + 195 41 CoreFoundation 0x01f1b7bb __CFRunLoopRun + 2715 42 CoreFoundation 0x01f1aa5b CFRunLoopRunSpecific + 443 43 CoreFoundation 0x01f1a88b CFRunLoopRunInMode + 123 44 UIKit 0x00729a02 -[UIApplication _run] + 571 45 UIKit 0x0072d106 UIApplicationMain + 1526 46 splitwithtabbar 0x0000beba main + 138 47 libdyld.dylib 0x02bf1ac9 start + 1 48 ??? 0x00000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException 语句的论据?

1 个答案:

答案 0 :(得分:1)

这是Fabric中的一个已知问题。在Github上的Fabric的问题跟踪器中有几个问题。例如,请参阅issue #256

<强>变通方法

你可以把

from secret import TEXT

another.py的第一行或将当前目录添加到模块搜索路径中。

def another_hello():

    import sys
    sys.path.insert(0, '')

    from secret import TEXT

    print 'Hello, world!'
    print 'text: ' + TEXT