dd возвращает 0 из bash, но возвращает ошибку при запуске с subprocess.run()

#python #python-3.x #bash #subprocess #dd

#python #python-3.x #bash #подпроцесс #dd

Вопрос:

Я пытаюсь запустить dd скрипт на Python с помощью subprocess.run() . Если я выполняю следующую команду из своего терминала, она работает нормально:

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

Примечание: ~/file.txt did не существует до команды, но создается автоматически.

Теперь, если я запускаю свой 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() ?

Комментарии:

1. Это не расширяет имя каталога ~ в ваш домашний каталог.

2. ^ … и вы можете использовать os.path.expanduser для этого.

3. @wim как именно я могу отредактировать свой exampel, чтобы сделать это?

Ответ №1:

subprocess.run() используется /bin/sh в качестве оболочки, что, вероятно, не совпадает с вашей интерактивной оболочкой (вероятно bash ).

sh ~/ заменяет ваш домашний каталог только тогда, когда он находится в начале слова. bash также расширяет его после = и : . So of=~/file расширяется в bash , но нет sh , поэтому он не расширяется при использовании subprocess.run() .

Вы можете просто использовать переменную среды напрямую вместо тильды.

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