在 bonobo 文档中,他们有以下配置服务依赖项的示例:
from bonobo.config import use
@use('orders_database')
def select_all(database):
yield from database.query('SELECT * FROM foo;')
我试图做类似的事情,并得到一个错误。这是我的脚本的一个非常简化的版本:
import bonobo
from bonobo.config import use
from ftplib import FTP
def get_services(**options):
ftp_1 = FTP('ftp.gnu.org')
ftp_1.login()
ftp_1.cwd('gnu/emacs')
return{
'ftp1': ftp_1,
}
@use('ftp1')
def listen_for_file(ftp):
test = ftp.nlst('README.olderversions')
if test:
print( 'Found file')
return True
else:
print('File not found in ftp')
return False
def get_graph(**options):
graph = bonobo.Graph()
graph.add_chain(listen_for_file)
return graph
if __name__ == '__main__':
parser = bonobo.get_argument_parser()
with bonobo.parse_args(parser) as options:
bonobo.run(get_graph(**options), services=get_services(**options))
如果我尝试运行它,我会收到以下错误:
CRITICAL:bonobo.execution.contexts.base:<NodeExecutionContext(+listen_for_file) in=1 err=1> Traceback(最近一次调用最后):文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\ lib\site-packages\bonobo\config\processors.py”,第 102 行,在调用中 绑定 = self._bind(_input) 文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site -packages\bonobo\config\processors.py”,第 89 行,在 _bind 中返回 bind(*self.args, *_input, **self.kwargs) 文件“C:\Users\mfrants\AppData\Local\Programs\Python \Python37\lib\inspect.py”,第 3015 行,在绑定中返回 args[0]._bind(args[1:], kwargs) 文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\ lib\inspect.py",第 2930 行,在 _bind 中从 None TypeError 中引发 TypeError(msg):缺少必需的参数:'ftp'
上述异常是以下异常的直接原因:
回溯(最后一次调用):文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\execution\contexts\node.py”,第 102 行,在循环中自我.step() 文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\execution\contexts\node.py”,第 129 行,步骤结果 = self._stack (input_bag) 文件“C:\Users\mfrants\AppData\Local\Programs\Python\Python37\lib\site-packages\bonobo\config\processors.py”,第 114 行,调用中 )来自 exc bonobo.errors.UnrecoverableTypeError : <function listen_for_file at 0x000002A591047F78> 的输入没有绑定到节点签名。Args: () Input: () Kwargs: {'ftp1': <ftplib.FTP object at 0x000002A5910CF708>} 签名: (ftp)
我可以让它运行的唯一方法是在 listen_for_file 函数中将 ftp 更改为 ftp1 。我在这里做错了什么?