В первую очередь, этот вопрос непосредственно не связан с tar
. Tar просто создает несжатый архив, сжатие затем применяется позже.
Gzip, как известно, относительно быстр по сравнению с LZMA2 и bzip2. Если скорость имеет значение, gzip
(особенно многопоточная реализация pigz
) часто хороший компромисс между скоростью сжатия и степенью сжатия. Хотя существуют альтернативы, если скорость является проблемой (например, LZ4).
Однако, если высокая степень сжатия желаема удары LZMA2 bzip2
почти в каждом аспекте. Скорость сжатия часто медленнее, но она распаковывает намного быстрее и обеспечивает намного лучшую степень сжатия за счет более высокого использования памяти.
Нет большой причины использовать bzip2
больше, кроме назад совместимости. Кроме того, LZMA2 был desiged с многопоточностью в памяти, и много реализаций по умолчанию используют многоядерные центральные процессоры (к сожалению, xz
на Linux не делает этого, еще). Это имеет смысл, так как тактовые частоты не будут больше увеличиваться, но количество ядер будет.
Там являются многопоточными bzip2
реализации (например. pbzip
), но они часто не устанавливаются по умолчанию. Также обратите внимание что многопоточный bzip2
только действительно окупитесь при сжатии, тогда как распаковка использует единственный поток, если файл был сжатием с помощью поточного сингла bzip2
, в отличие от LZMA2. Параллель bzip2
варианты могут только усилить многоядерные центральные процессоры, если файл был сжат с помощью параллели bzip2
версия, которая часто является не случаем.
Python не раскрывает переменные в строках так же, как bash. Если у вас есть VAR
в python и вы хотите передать это в bash, вы можете сделать
subprocess.call('echo {} | /path/to/script --args'.format(VAR), shell=True)
, если VAR
в python содержит имя переменной bash, которую вы хотите расширить, вы можете сделать то же самое :
subprocess.call('echo "${}" | /path/to/script --args'.format(VAR), shell=True)
Не используйте os.system ()
, он устарел в пользу модуля subprocess
.
В вашем случае вы можете использовать модуль subprocess
напрямую, и лучше не использовать параметр shell = True
, так как запускать команды непосредственно в оболочке небезопасно. Все функции, которые вам нужны, например pipe, могут быть эмулированы модулем subprocess
.
Возьмем этот пример:
import subprocess
var = 'foobar'
first = subprocess.Popen(['/bin/echo', var], stdout=subprocess.PIPE)
second = subprocess.Popen(['bash', '/path/to/script', '--args'], stdin=first.stdout)
мы определили переменную var
, затем мы использовали класс subprocess.Popen
, чтобы получить значение var
] с помощью / bin / echo
, а затем отправил это значение в канал. первый
является объектом класса subprocess.Popen
.
Затем мы использовали STDOUT первый
как STDIN второй
через канал и выполнили скрипт bash
соответственно.
Если вы хотите сохранить вывод команды в виде строки, используйте вместо этого функцию subprocess.check_output
, например :
second = subprocess.check_output(['bash', '/path/to/script', '--args'], stdin=first.stdout)
Прочтите официальную документацию модуля подпроцесса , чтобы получить больше информации.
Вызов os.system ()
устарел, но все еще действителен. Эта функциональность может исчезнуть в будущем (вероятно, исчезнет), поэтому вы можете серьезно подумать о рефакторинге этих вызовов с помощью модуля subprocess
, который имеет очень простой способ отправки данных в подпроцесс STDIN и прочтите его STDOUT. https://docs.python.org/2/library/subprocess.html
Я думаю, что хорошая практика:
var = subprocess.Popen(['/bin/echo', var], stdout=subprocess.PIPE)
second = subprocess.Popen(['bash', '/path/to/script', '--args'],stdin=var.stdout, stdout=subprocess.PIPE)
var.stdout.close()
output = second.communicate()[0]
var.wait()