当前位置: 首页 > 面试题库 >

子流程Popen和call有什么区别(如何使用它们)?

凌通
2023-03-14
问题内容

我想从Python调用一个外部程序。我已经用过Popen()并且call()做到了。

两者有什么区别?

我的特定目标是从Python运行以下命令。我不确定重定向如何工作。

./my_script.sh > output

我阅读了文档,并说它call()是便利功能或快捷功能。我们使用call()代替会失去任何功能Popen()吗?


问题答案:

有两种方法可以进行重定向。两者都适用于subprocess.Popensubprocess.call

  1. 设置关键字参数shell = Trueexecutable = /path/to/the/shell并在那里指定命令。

  2. 由于您只是将输出重定向到文件,因此请设置关键字参数

    stdout = an_open_writeable_file_object
    

对象指向output文件的位置。

subprocess.Popensubprocess.call

Popen不会阻塞,允许您在进程运行时与它进行交互,或者在Python程序中继续进行其他操作。调用Popen返回一个Popen对象。

call 确实会
阻止。它支持与Popen构造函数相同的所有参数,因此您仍可以设置进程的输出,环境变量等,脚本将等待程序完成,并call返回表示进程退出状态的代码。

returncode = call(*args, **kwargs)

与通话基本相同

returncode = Popen(*args, **kwargs).wait()

call只是一种便利功能。它在CPython的实现是在subprocess.py:

def call(*popenargs, timeout=None, **kwargs):
    """Run command with arguments.  Wait for command to complete or
    timeout, then return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])
    """
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

如您所见,它周围是薄薄的包装纸Popen



 类似资料:
  • 问题内容: 我的工作应该使用并行技术,并且我是python的新用户。因此,我想知道您是否可以共享有关python和模块的一些资料。两者有什么区别? 问题答案: 该模块使您可以运行和控制其他程序。您可以使用计算机上的命令行启动的任何内容,都可以使用此模块运行和控制。使用它可以将外部程序集成到您的Python代码中。 该模块可让您将以python编写的任务划分为多个进程,以帮助提高性能。它提供与该模块

  • 问题内容: 考虑: 我尝试通过以下方式调用此过程: 但这只会产生 但是,如果我将其更改为 一切正常。尽管文档指出这是正确的语法,但这仍然可行。 为什么什么时候不工作? 问题答案: 如您的文档所述,Yup ..是可从ODBC驱动程序使用的构造/语法。 还有的T-SQL文档中没有提及,只。 它不起作用,因为它不是T-SQL。

  • 我正在学习,但我对这段代码有点困惑: 输出: 如您所见,输出是格式化的。但是我不知道为什么结尾有字符和。 如果我在终端中运行此命令,则没有这些字符。 正常输出: 我怎样才能移除它们?

  • 这里也有类似的问题,但它们与特定的编程语言有关,我正在寻找概念层面的答案。 据我所知,functor本质上是不可变的容器,它公开了派生另一个functor的map()API。哪种加法可以将特定的函子称为单子? 据我所知,每个仿函数都是仿函数,但不是每个仿函数都是单子。

  • 问题内容: 使用和调用函数有什么区别? 与 前述两种方法之间是否存在性能差异?什么时候最好使用over ,反之亦然? 问题答案: 不同之处在于,您可以使用数组作为函数来调用函数。需要明确列出参数。有用的助记是 “ 甲用于 一个rray和ç为 ÇOMMA”。 有关apply和call的信息,请参见MDN的文档。 伪语法: 从ES6开始,数组也可以与该函数一起使用,您可以在此处查看兼容性。 样例代码:

  • 问题内容: 在Swift 2.0中 ,Apple引入了一种处理错误的新方法(do- try-catch)。几天前,在Beta 6中,甚至引入了一个更新的关键字()。另外,知道我可以使用。这3个关键字之间有什么区别,何时使用每个关键字? 问题答案: 已为Swift 5.1更新 假定以下抛出函数: 当您尝试调用可能抛出的函数时,有2个选项。 您可以通过将呼叫围绕在do-catch块中来承担 处理错误