【问题标题】:output of one file input to next输出一个文件输入到下一个
【发布时间】:2015-06-15 06:48:01
【问题描述】:

如何将一个脚本的输出作为输入传递给另一个?例如,如果 a.py 输出 format.xml,那么 a.py 如何调用 b.py 并将参数 format.xml 传递给它?我认为它应该像在命令行上完成管道一样工作。

我被一群具有特定领域知识的科学家聘用,但有时对计算机编程的要求没有意义。有一长串“模块”,我的老板非常坚持认为 1 个模块就是 1 个 python 脚本,一个模块的输出就是下一个模块的输入。我对 Python 很陌生,但如果这种设计模式对任何人敲响了警钟,请告诉我。

更糟糕的是,项目将被转换为可执行格式(使用 py2exe),并且仍然必须有与 .py 文件相同数量的可执行文件。

【问题讨论】:

  • 你应该确保你理解期望:也许“模块”真的意味着一个概念模块,而你的老板只是想让你编​​写纯函数。这是相当合理的——尤其是在科学环境中。

标签: python python-3.x requirements


【解决方案1】:

这种模式在某些情况下是有意义的,但对我来说,这是您希望能够将每个模块作为一个自我维持的可执行文件运行的时候。

I.E.如果您想在 FORTRAN 或类似语言中使用脚本,这是最简单的方法,将 python 模块构建为可执行文件,然后从 FORTRAN 调用它。

这并不意味着一个模块是pr定义1的python文件,只是它只有一个入口点,实际上是可执行的。

一个模块公关脚本,可能是为了更容易找到代码。或者邮寄给某人进行代码检查或同行评审(通常在科学界进行)

所以要求可能是技术和社会要求的混合体。

还是回到问题上来。

我会使用 subprocess 模块来调用下一个模块。 (close_fds 设置为 true)

如果 close_fds 为 true,则除 0、1 和 2 之外的所有文件描述符都将 在子进程执行之前关闭。 (仅限 Unix)。或者,在 Windows,如果 close_fds 为真,则不会继承任何句柄 子进程。请注意,在 Windows 上,您不能将 close_fds 设置为 true 并通过设置标准输入、标准输出或重定向标准句柄 标准错误。

【讨论】:

    【解决方案2】:

    在 Python 中模拟 a | b shell 管道:

    #!/usr/bin/env python
    from subprocess import check_call
    
    check_call('a | b', shell=True)
    

    a 程序写入其标准输出流,并且b 程序一无所知b 程序从它的标准输入中读取,并且a 程序一无所知

    更灵活的方法是在a.pyb.py 模块中定义与对象一起使用的函数、类,并根据if __name__ == "__main__" 块中的这些函数实现生成/使用xml 的命令行界面,例如,a.py:

    #!/usr/bin/env python
    import sys
    import xml.etree.ElementTree as etree
    
    def items():
        yield {'name': 'a'}
        yield {'name': 'b'}
    
    def main():
       parent = etree.Element("items")
       for item in items():
           etree.SubElement(parent, 'item', attrib=item)
       etree.ElementTree(parent).write(sys.stdout) # set encoding="unicode" on Python 3
    
    if __name__=="__main__":
        main()
    

    当不从命令行调用脚本时,它可以避免不必要的序列化到 xml/从 xml 反序列化:

    #!/usr/bin/env python
    import a, b
    
    for item in a.items():
        b.consume(item)
    

    注意:item 可以是任意 Python 对象,例如 dict 或自定义类的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多