2

我对开发自我记录的管道很感兴趣。

我可以将Ruffus任务包装在Pweave块中吗?

Pweave and Ruffus
==============================================================

**Let's see if Pweave and ruffus can play nice**


<<load_imports>>=
import time
from ruffus import *
@

**Do this**
<<task1>>=
task1_param = [
                    [ None, 'job1.stage1'], # 1st job
                    [ None, 'job2.stage1'], # 2nd job
              ]
@files(task1_param)
def first_task(no_input_file, output_file):
    open(output_file, "w")
@

我感觉 Ruffus 装饰器正在抛弃 Pweave:

$ Pweave ruffus.Pnw
Processing chunk 1 named load_imports
Processing chunk 2 named task1
<type 'exceptions.TypeError'>
("unsupported operand type(s) for +: 'NoneType' and 'str'",)

也许有解决方法?

4

2 回答 2

2

我是 Ruffus 的作者,刚刚签入了对 ruffus 的更改,以允许它与 pweave 合作到谷歌源代码存储库中。我将在下一个版本中。

如果您不耐烦,可以使用以下命令行获取最新(固定)源:

hg clone https://bunbun68@code.google.com/p/ruffus/ 

狮子座

详细情况如下:

Ruffus 使用每个 ruffus 任务函数的全限定名(带模块名称)来唯一标识代码,以便可以通过名称引用管道任务。

Pweave 代码非常简单。好的!Pweave 一次将代码块发送到 python 解释器,以便exec逐块编辑。当然,块不属于任何“模块”,并且任务函数具有function.__module__的值None而不是任何字符串。

一次明智的str()转换None似乎"None"已经解决了这个问题。

狮子座

于 2012-01-14T17:53:53.600 回答
1

作为记录,pweave 与装饰器配合得很好。

这与 ruffus 如何识别哪个函数是哪个有关——该函数实际上必须属于一个模块文件,因为function.__module__使用了该属性。我不确定您是否可以欺骗它来包含创建这些函数标识符所需的所有信息。

如果您编辑pweb.pypweave 包含的脚本,try:...except使函数中的 : 语句pweave()更加冗长(最简单的方法是注释掉tryexcept部分),您可以自己查看错误。你得到的错误在最深的地方。

出于教学目的,我建议远离像 ruffus 这样的复杂库,因为 ruffus 特别使用了许多技巧(如果你愿意的话,语法糖)来提供简单的用户界面。如果您不打算为此目的使用它,您可以尝试联系对我的功能请求非常敏感的作者。他可能对如何做到这一点有一些想法。

于 2012-01-09T20:38:32.443 回答