我想从Python调用一个外部程序.我用了Popen()call()来做这件事.

这两者有什么区别?

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

./my_script.sh > output

我读了the documentation,它说call()是一个便利功能或快捷功能.我们用call()而不是Popen()会失go 能量吗?

推荐答案

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

  1. 设置关键字参数shell = Trueexecutable = /path/to/the/shell,并按原样指定命令.

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

    stdout = an_open_writeable_file_object
    

    其中对象指向output文件.

subprocess.Popensubprocess.call更普遍.

不会挡路,允许您在进程运行时与其交互,或者继续执行Python程序中的其他操作.调用Popen将返回一个Popen对象.

call does街区.虽然它支持与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相关问答推荐

有没有方法可以修复删除了换码字符的无效的SON记录?

数字梯度的意外值

如何使用scipy从频谱图中回归多个高斯峰?

Pytest两个具有无限循环和await命令的Deliverc函数

如何避免Chained when/then分配中的Mypy不兼容类型警告?

用合并列替换现有列并重命名

从groupby执行计算后创建新的子框架

Pre—Commit MyPy无法禁用非错误消息

使用密钥字典重新配置嵌套字典密钥名

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

如何根据一列的值有条件地 Select 前N组?

Pandas Loc Select 到NaN和值列表

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

寻找Regex模式返回与我当前函数类似的结果

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

如何在Great Table中处理inf和nans

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

如果有2个或3个,则从pandas列中删除空格

递归函数修饰器