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,然后它的作品!
为什么会那样?对我来说更重要的是:我怎样才能让它发挥作用? 我不知道生产中的用户名是什么.
您需要使用以下命令包装这些路径名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)
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('~')。