【问题标题】:Using python buitin commands for writing to a file vs using subprocess to run similar shell command使用 python 内置命令写入文件与使用子进程运行类似的 shell 命令
【发布时间】:2021-06-13 18:20:17
【问题描述】:

如果我使用 python 命令,我必须打开一个文件,写入它,然后关闭它。

foo = open("file name", w+)
foo.write("blah")
foo.close() 

通过使用subprocess.run,我可以运行linux shell 命令subprocess.call(['echo', 'blah', '>', 'foo'])

这发生在一个无限循环内,每秒钟重复一次,因此应该尽可能缩短时间。

问题是我应该使用哪种方法?

【问题讨论】:

  • 你试过subprocess.call(['echo', 'blah', '>', 'foo'])吗?成功了吗?
  • 嗯,好像有问题,subprocess.call(['echo', 'blah', '>', 'foo']) 给出消息CompletedProcess(args=['echo', 'blah', '>', 'foo'], returncode=0) 但没有创建文件。另一方面,os.system('echo blah > foo')` 有效!这是为什么呢?
  • > 在 shell 命令中具有特殊意义。 subprocess.call 所写的不会运行 shell 命令。

标签: python-3.x linux shell file subprocess


【解决方案1】:

比你想象的还要糟糕!重定向是一个 shell 操作,所以你的命令不会有预期的结果。充其量,如果它可以在 PATH 中找到 echo 命令,它将在标准输出上写入 blah > foo,更糟糕的是,它会因为找不到 echo 命令而失败。要使子进程命令起作用,您必须添加一个shell=True 参数。

然后在每个操作中,您将启动一个新的 shell 来执行 echo 命令。启动流程是一项昂贵的操作。如果你只每秒循环一次,它可能甚至不会被注意到,但它比直接写入文件要昂贵得多。

但最 Pythonic 的方式是使用上下文管理器:

with open("file name", "w") as foo:
    foo.write('blah\n')

【讨论】:

  • 谢谢。 os.system 似乎有效,使用它会是一个坏习惯吗?只是问问。
猜你喜欢
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2021-12-07
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多