子进程Popen和调用之间有什么区别(我如何使用它们)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (47)

我想从Python调用一个外部程序。我都用过Popen()call()去做这个。

这两者有什么区别?

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

./my_script.sh > output

有没有因为使用call()而不是Popen()?

提问于
用户回答回答于

有两种方法可以进行重定向。两者都适用于subprocess.Popen或subprocess.call。 设置关键字参数shell = True或者可执行文件= / path / to / the / shell并且像在那里一样指定命令。 由于只是将输出重定向到文件,请设置关键字参数 stdout = an_open_writeable_file_object 对象指向输出文件的位置。 subprocess.Popen比subprocess.call更普遍。 Popen不会阻塞,允许在流程运行时与流程交互,也可以在Python程序中继续进行其他操作。对Popen的调用返回一个Popen对象。 通话确实阻止。虽然它支持所有与Popen构造函数相同的参数,但仍然可以设置进程的输出,环境变量等,脚本等待程序完成,调用返回代表进程退出状态的代码。 returncode = call(* args,** kwargs) 与调用基本相同 returncode = Popen(* args,** kwargs).wait() 通话只是一种便利功能。它在CPython中的实现是在subprocess.py中: def call(* popenargs,timeout = None,** kwargs): msgstr“”“使用参数运行命令。等待命令完成或 超时,然后返回returncode属性。 参数与Popen构造函数相同。例: retcode = call(["ls", "-l"]) """ with Popen(*popenargs, **kwargs) as p: try: return p.wait(timeout=timeout) except: p.kill() p.wait() raise 正如你所看到的,这是一个围绕Popen的薄包装。

扫码关注云+社区