【问题标题】:Running sed command with Python doesn't work as it does in bash? [duplicate]用 Python 运行 sed 命令不像在 bash 中那样工作? [复制]
【发布时间】:2021-11-10 23:38:03
【问题描述】:

我正在尝试从 Python 脚本执行此命令:

sed -i s/"exited_cleanly":false/"exited_cleanly":true/ ~/.config/chromium/Default/Preferences

当我从 bash 控制台运行时,它会成功。

但是当我使用以下代码运行时,它不会:

    process = subprocess.Popen(['sed', '-i', 's/"exited_cleanly":false/"exited_cleanly":true/', '~/.config/chromium/Default/Preferences'], stdout=subprocess.PIPE)
    process.communicate()

    >>> sed: can't read ~/.config/chromium/Default/Preferences: No such file or directory

但是这个文件明明是存在的,我能找到,等等

有什么问题?我错过了什么吗?

我使用的是 Python 3.9

谢谢!

爱德华多

【问题讨论】:

  • 考虑 Barmar 的 cmets 关于将 JSON 编辑为 JSON 而不是作为回显文本更合理。
  • 在过去的生活中,我有一个客户坚持这样做(用他们自己的手动解析器解析我们的 API 响应),这让我的生活变得悲惨;我们会更改库或设置,并且我们的输出将以任何符合标准的解析器都会忽略的方式进行修改,但是他们的会爆炸并且他们会打电话给支持。将 JSON 视为 JSON 而不是将其视为字符串对每个人(包括您未来的自己)来说都会减少麻烦。

标签: python-3.x bash sed subprocess


【解决方案1】:

~ 由 shell 扩展,它不是实际路径名的一部分。由于您没有使用 shell 来执行命令,因此它没有被扩展。您可以使用 Python 函数 os.path.expanduser() 来执行此操作。

import os

process = subprocess.Popen(['sed', '-i', 's/"exited_cleanly":false/"exited_cleanly":true/', os.path.expanduser('~/.config/chromium/Default/Preferences')], stdout=subprocess.PIPE)

我不确定您为什么要使用 sed 来执行此操作。 Python 可以读取和写入文件本身。看起来您正在尝试使用字符串操作修改 JSON。最好用json.load()读取文件,修改数据,然后用json.dump()重写文件。

【讨论】:

  • 哈!我同时找到了答案哈哈我会离开,因为我做的有点不同,但当然接受你的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多