在python脚本中引入YAML字符串

在python脚本中引入YAML字符串,python,python-2.7,yaml,pysb,Python,Python 2.7,Yaml,Pysb,我正在编写一个python代码,能够读取YAML文件并在PySB中生成基于规则的模型 YAML文件中指定的新规则如下: --- !rule name: L_binds_R reaction: L(unbound) + R(inactive) >> L(bound)%R(active) rates: - Kf 通过这个,我在python中创建了一个pyyaml对象(pyyaml是一个在python中使用yaml的包),并且反应属性存储为字符串 然后,pysb中的规则需

我正在编写一个python代码,能够读取YAML文件并在PySB中生成基于规则的模型

YAML文件中指定的新规则如下:

--- !rule
name: L_binds_R
reaction:
    L(unbound) + R(inactive) >> L(bound)%R(active)
rates:
    - Kf
通过这个,我在python中创建了一个pyyaml对象(pyyaml是一个在python中使用yaml的包),并且反应属性存储为字符串

然后,pysb中的规则需要指定为:

# Rule(name, reaction, constant)
Rule('L_binds_R', L(unbound) + R(inactive) >> L(bound)%R(active), kf)
我的问题在于yaml中的“reaction”字段作为字符串存储在python对象中,但pysb不接受纯文本以外的任何其他格式

我已经检查了PySB,反应字段在任何情况下都不能是字符串,我没有找到如何在YAML中替换变量的格式


有没有解决问题的方法?

您可以采用以下两种方法之一:重新构造YAML查找以标记化反应规则,或者在Python中使用
eval

标记化反应规则 最好的方法是构造YAML文件,使您的反应规则已经在单个标记中指定,而不是整个反应只指定一个字段,例如

--- rule!
name: L_binds_R
reaction:
    reactant:
        name: L
        site: b
    reactant:
        name: R
        site: b
            state: inactive         
    product:
        name: L
        site: b
            bond: 1
    product:
        name: R
        site: b
            bond: 1
            state: active
    fwd_rate: kf
然后,您可以编写一个解析器,将其转换为以下PySB规则,使用PySB核心中的类(
MonomerPattern
ComplexPattern
等等)构建
ReactionPattern

如果您可以控制YAML来自的代码,那么您可能会发现直接输出PySB代码或者写入SBML这样的标准更容易

您可能会发现,查看我编写的从BioNetGen XML文件创建PySB模型的示例很有帮助,该示例演示了如何从外部文件创建模型

使用
eval
另一种方法是使用
eval
。虽然这是一个更简单的解决方案,但出于安全原因,强烈反对使用它。但是,如果YAML文件都是由您/您自己的代码生成的,并且您只需要快速修复,那么就可以了

下面是一个例子:

# You would read these in from the YAML file, but I’ll just define
# the strings here for simplicity
reaction_name = "L_binds_R"
reaction_str = "L(b=None) + R(b='inactive') >> L(b=1) % R(b=('active', 1))"
reaction_fwd_rate = "Kf"

Rule(reaction_name, eval(reaction_str), eval(reaction_fwd_rate))
# Python output 
# (assumes Monomers L and R and parameter Kf are already defined):
# >>> Rule('L_binds_R', L(b=None) + R(b='inactive') >> L(b=1) % R(b=('active', 1)), Kf)

*考虑YAML包含以下内容的情况:

reaction:
    import shutil; shutil.rmtree('~')

导入YAML文件并
eval
ing该字段将删除您的主目录
eval
将根据定义执行任意Python代码。它只应在源文件完全受信任的情况下使用。一般来说,您应该始终“清理您的输入”(假设输入是危险的,除非另有证明)。

您可以采用以下两种方法之一:重组YAML find以标记化反应规则,或者在Python中使用
eval

标记化反应规则 最好的方法是构造YAML文件,使您的反应规则已经在单个标记中指定,而不是整个反应只指定一个字段,例如

--- rule!
name: L_binds_R
reaction:
    reactant:
        name: L
        site: b
    reactant:
        name: R
        site: b
            state: inactive         
    product:
        name: L
        site: b
            bond: 1
    product:
        name: R
        site: b
            bond: 1
            state: active
    fwd_rate: kf
然后,您可以编写一个解析器,将其转换为以下PySB规则,使用PySB核心中的类(
MonomerPattern
ComplexPattern
等等)构建
ReactionPattern

如果您可以控制YAML来自的代码,那么您可能会发现直接输出PySB代码或者写入SBML这样的标准更容易

您可能会发现,查看我编写的从BioNetGen XML文件创建PySB模型的示例很有帮助,该示例演示了如何从外部文件创建模型

使用
eval
另一种方法是使用
eval
。虽然这是一个更简单的解决方案,但出于安全原因,强烈反对使用它。但是,如果YAML文件都是由您/您自己的代码生成的,并且您只需要快速修复,那么就可以了

下面是一个例子:

# You would read these in from the YAML file, but I’ll just define
# the strings here for simplicity
reaction_name = "L_binds_R"
reaction_str = "L(b=None) + R(b='inactive') >> L(b=1) % R(b=('active', 1))"
reaction_fwd_rate = "Kf"

Rule(reaction_name, eval(reaction_str), eval(reaction_fwd_rate))
# Python output 
# (assumes Monomers L and R and parameter Kf are already defined):
# >>> Rule('L_binds_R', L(b=None) + R(b='inactive') >> L(b=1) % R(b=('active', 1)), Kf)

*考虑YAML包含以下内容的情况:

reaction:
    import shutil; shutil.rmtree('~')

导入YAML文件并
eval
ing该字段将删除您的主目录
eval
将根据定义执行任意Python代码。它只应在源文件完全受信任的情况下使用。一般来说,您应该始终“清理输入”(假设输入是危险的,除非得到其他证明)。

您必须解析
反应
字符串并在Python中重新构建该表达式,或者使用
eval()
并引入运行任意Python代码的能力(如果您的应用程序接受来自不可信来源的输入,这将是一个巨大的安全漏洞。)“反应”字段是什么?YAML中没有字段,Python中也没有字段。什么是PyYAML对象?或者您的意思是您正在使用PyYAML创建Python对象。PySB使用运算符重载来“生成”Python本身会解析直接用Python代码编写的规则表达式,因此,如果不使用
eval
,就没有完全通用的方法来做您想要做的事情。如果您可以在总体目标上进行更多的扩展,我们可能会建议一些替代方法。您要么解析
反应
字符串,然后重新构建该表达式或者使用
eval()
并引入运行任意Python代码的能力(如果您的应用程序接受来自不受信任源的输入,这将是一个巨大的安全漏洞)。什么是“反应”字段?YAML中没有字段,Python中也没有字段。什么是PyYAML对象?或者您的意思是您正在使用PyYAML创建Python对象。PySB使用运算符重载“make”Python本身解析直接用Python代码编写的规则表达式,因此,如果不使用
eval
,就没有完全通用的方法来做您想做的事情。如果您可以对总体目标进行更多的扩展,我们可能会提出一些替代方法。请参阅此处:请参阅此处: