【问题标题】:Can't pass file handle to subprocess无法将文件句柄传递给子进程
【发布时间】:2017-08-07 21:49:51
【问题描述】:

我在当前目录中用echo "foo" > foo 创建了一个文件。然后我尝试将该文件传递给subprocess.run,但我似乎误解了Python 中如何处理文件路径,因为我遇到了错误。怎么了?

我的测试代码

with open('foo') as file:
    import subprocess
    subprocess.run(['cat',file])

产量

TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper

什么是PathLike 对象?我如何从open('foo') 获得它?在哪里可以找到有关 Python 如何处理文件的更多信息?

【问题讨论】:

  • 它需要一个 string-likePathLike 对象。只需通过'foo'。你为什么要open文件呢?
  • 与“path like”相反,有所谓的"file like" objects(就像你试图传递给subprocess.run()的那个)。简而言之,这些文件句柄允许您从 Python 内部 操作文件(或流,一般而言),使用 read()write() 等方法。

标签: python python-3.x file


【解决方案1】:

首先不需要打开文件。你可以简单地运行

import subprocess
subprocess.run(['cat', 'foo'])

cat 命令正在由您的机器作为 shell 命令运行,因此您应该能够将文件名作为字符串传递。

Python 根本不处理该文件。 subprocess 的重点是将命令传递给底层系统(在这种情况下,显然是基于 UNIX 的操作系统)。您所做的只是将明文命令传递到命令行。

不过,我不会阻止您阅读有关文件处理的内容。查看this 文档。

【讨论】:

    【解决方案2】:

    PathLike 对象:docs

    如何从open调用的return value获取它:

    使用name 字段

    subprocess.run(['cat',file.name])
    

    了解python文件:Reading and writing files

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 2013-07-14
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多