Fabric 导入错误:"fab task" 与 "from fabfile import task; task()"
Fabric import bug: "fab task" vs. "from fabfile import task; task()"
这也与 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
为什么会有这种差异?
现在,我找到了使这项工作可行的技巧。只需在 fabfile.py
的开头添加一个 import secret
。我认为发生的情况是 fab
工具在打开 fabfile.py
以查找特定任务时仅适用于适当的 PYTHONPATH
,但是一旦它导入任务并实际启动 运行 它,然后发生了一些变化,因此它无法再访问原始文件夹。
我的技巧可行吗?但它不会破坏封装,最后说,因为 fabfile.py
应该知道它调用的任何函数或方法的 所有间接依赖关系 吗?也许这是反对函数内 import
语句的论据?
这是 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
这也与 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
为什么会有这种差异?
现在,我找到了使这项工作可行的技巧。只需在 fabfile.py
的开头添加一个 import secret
。我认为发生的情况是 fab
工具在打开 fabfile.py
以查找特定任务时仅适用于适当的 PYTHONPATH
,但是一旦它导入任务并实际启动 运行 它,然后发生了一些变化,因此它无法再访问原始文件夹。
我的技巧可行吗?但它不会破坏封装,最后说,因为 fabfile.py
应该知道它调用的任何函数或方法的 所有间接依赖关系 吗?也许这是反对函数内 import
语句的论据?
这是 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