Python 什么';子进程Popen和call之间的区别是什么(我如何使用它们)?

Python 什么';子进程Popen和call之间的区别是什么(我如何使用它们)?,python,subprocess,popen,Python,Subprocess,Popen,我想从Python调用一个外部程序。我使用了Popen()和call()来实现这一点 这两者有什么区别 我的具体目标是从Python运行以下命令。我不知道重定向是如何工作的 ./my_script.sh > output 我读到它说,call()是一个方便函数或快捷函数。如果使用call()而不是Popen(),我们会失去电源吗?有两种方法可以重定向。两者都适用于子流程.Popen或子流程.call 将关键字参数shell=True或executable=/path/to/the/she

我想从Python调用一个外部程序。我使用了
Popen()
call()
来实现这一点

这两者有什么区别

我的具体目标是从Python运行以下命令。我不知道重定向是如何工作的

./my_script.sh > output

我读到它说,
call()
是一个方便函数或快捷函数。如果使用
call()
而不是
Popen()
,我们会失去电源吗?

有两种方法可以重定向。两者都适用于
子流程.Popen
子流程.call

  • 将关键字参数
    shell=True
    executable=/path/to/the/shell
    设置为/shell,并按原样指定命令

  • 因为您只是将输出重定向到一个文件,所以设置关键字参数

    stdout = an_open_writeable_file_object
    
    其中对象指向
    输出
    文件

  • 比一般的更普遍

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

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

    returncode = call(*args, **kwargs) 
    
    基本上和打电话一样

    returncode = Popen(*args, **kwargs).wait()
    
    调用
    只是一个方便的功能。它在CPython中的实现是:


    如您所见,它是一个薄薄的包装,围绕着
    Popen

    另一个答案非常完整,但这里有一条经验法则:

    • 呼叫
      被阻塞:

      call('notepad.exe')
      print('hello')  # only executed when notepad is closed
      
    • Popen
      是非阻塞的:

      call('notepad.exe')
      print('hello')  # only executed when notepad is closed
      
      Popen('notepad.exe')
      print('hello')  # immediately executed
      

    文档的哪一部分让您感到困惑?
    call()
    的定义似乎非常清楚。你能提供一个报价或链接让我们知道在回答中应该关注什么吗?基本上,Popen和call是分别用于运行Linux命令的异步和同步函数。使用Popen的优势是什么?“等到被调用的程序首先完成不是很安全吗?”汤姆经常这样。如果您想读取一些输出,然后向程序发送更多输入,读取该输入产生的更多输出,重复?@user3016020我想这也适用于Windows命令?是吗?@user3016020我不明白你的意思,你能详细解释一下吗?使用运行Linux命令..很好而且容易理解的解释。非常感谢。