Tilde(〜)在subprocess.Popen()中不起作用

Ric*_*Art 5 python subprocess dd popen

当我在我的Ubuntu终端中运行时:

sudo dd if=/dev/sda of=~/file bs=8k count=200k; rm -f ~/file
Run Code Online (Sandbox Code Playgroud)

它工作正常.

如果我通过Pythons运行它subprocess.Popen():

output, err = subprocess.Popen(['sudo', 'dd', 'if=/dev/' + disk, 'of=~/disk_benchmark_file', 'bs=8k', 'count=200k'], stderr=subprocess.PIPE).communicate()
print err
Run Code Online (Sandbox Code Playgroud)

它不起作用.我得到的错误是:

dd:无法打开'〜/ disk_benchmark_file':没有这样的文件或目录

如果我在改变Popen()通话的波浪~/home/user,然后它的作品!

为什么会那样?对我来说更重要的是:我怎样才能让它发挥作用? 我不知道生产中的用户名是什么.

Dan*_* D. 7

您需要使用以下命令包装这些路径名os.path.expanduser():

>>> import os
>>> os.path.expanduser('~/disk_benchmark_file')
'/home/dan/disk_benchmark_file'
Run Code Online (Sandbox Code Playgroud)

在您的代码中出现:

['sudo', 'dd', 'if=/dev/' + disk, 'of=~/disk_benchmark_file', 'bs=8k', 'count=200k']
Run Code Online (Sandbox Code Playgroud)

应替换为:

['sudo', 'dd', 'if=/dev/' + disk, 'of=' + os.path.expanduser('~/disk_benchmark_file'), 'bs=8k', 'count=200k']
Run Code Online (Sandbox Code Playgroud)


Ric*_*lia 5

import os
import shlex

outfile = os.path.expanduser('~/file')
cmd_string = 'sudo dd if=/dev/sda of=%s bs=8k count=200k; rm -f %s' % (outfile, outfile)
cmd_list = shlex.split(cmd_string)

# Then use cmd_list as argument for Popen
Run Code Online (Sandbox Code Playgroud)

shlex.split是生成必须command在子流程中使用的列表的标准和最安全的方法。它能够处理所有异常并使您的代码更易于阅读

您可以找到homeusing os.path.expanduser('~')