【问题标题】:dd returns 0 from bash, but returns an error if run with subprocess.run()dd 从 bash 返回 0,但如果使用 subprocess.run() 运行则返回错误
【发布时间】:2021-01-14 11:19:24
【问题描述】:

我正在尝试使用 subprocess.run() 从 Python 脚本运行 dd。如果我从终端运行以下命令,它可以正常工作:

dd if=/dev/zero of=~/file.txt bs=512 count=1000 oflag=dsync

注意:~/file.txt 在命令之前不存在,而是自动创建的。

现在,如果我启动我的 python3 并这样做

cmd='dd if=/dev/zero of=~/file.txt bs=512 count=1000 oflag=dsync'
import subprocess
ReturnVariable = subprocess.run(cmd, shell=True)

我明白了

dd: failed to open '~/file.txt': No such file or directory

~/file.txt 存在和不存在都会发生这种情况。反正它没有多大意义,因为它是输出文件,而不是输入文件。

我做错了什么?为什么我通过subprocess.run()调用相同的命令在同一台机器上不起作用?

【问题讨论】:

  • 它没有将目录名称~ 扩展到您的主目录。
  • ^ ... 你可以使用os.path.expanduser 来做到这一点。
  • @wim 我该如何编辑我的示例来做到这一点?

标签: python python-3.x bash subprocess dd


【解决方案1】:

subprocess.run() 使用/bin/sh 作为shell,这可能与您的交互式shell 不同(可能是bash)。

sh 仅在单词开头时将 ~/ 替换为您的主目录。 bash 也在=: 之后扩展它。所以of=~/filebash中被扩展,而不是sh,所以当你使用subprocess.run()时它不会被扩展。

您可以直接使用环境变量而不是波浪号。

cmd='dd if=/dev/zero of=$HOME/file.txt bs=512 count=1000 oflag=dsync'

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2015-06-27
    • 2021-07-17
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多