передача значения переменной python в сценарий bash (внутри сценария python)

В первую очередь, этот вопрос непосредственно не связан с tar. Tar просто создает несжатый архив, сжатие затем применяется позже.

Gzip, как известно, относительно быстр по сравнению с LZMA2 и bzip2. Если скорость имеет значение, gzip (особенно многопоточная реализация pigz) часто хороший компромисс между скоростью сжатия и степенью сжатия. Хотя существуют альтернативы, если скорость является проблемой (например, LZ4).

Однако, если высокая степень сжатия желаема удары LZMA2 bzip2 почти в каждом аспекте. Скорость сжатия часто медленнее, но она распаковывает намного быстрее и обеспечивает намного лучшую степень сжатия за счет более высокого использования памяти.

Нет большой причины использовать bzip2 больше, кроме назад совместимости. Кроме того, LZMA2 был desiged с многопоточностью в памяти, и много реализаций по умолчанию используют многоядерные центральные процессоры (к сожалению, xz на Linux не делает этого, еще). Это имеет смысл, так как тактовые частоты не будут больше увеличиваться, но количество ядер будет.

Там являются многопоточными bzip2 реализации (например. pbzip), но они часто не устанавливаются по умолчанию. Также обратите внимание что многопоточный bzip2 только действительно окупитесь при сжатии, тогда как распаковка использует единственный поток, если файл был сжатием с помощью поточного сингла bzip2, в отличие от LZMA2. Параллель bzip2 варианты могут только усилить многоядерные центральные процессоры, если файл был сжат с помощью параллели bzip2 версия, которая часто является не случаем.

2
03.09.2015, 21:28
4 ответа

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)
1
27.01.2020, 21:54

Не используйте 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)

Прочтите официальную документацию модуля подпроцесса , чтобы получить больше информации.

5
27.01.2020, 21:54

Вызов os.system () устарел, но все еще действителен. Эта функциональность может исчезнуть в будущем (вероятно, исчезнет), поэтому вы можете серьезно подумать о рефакторинге этих вызовов с помощью модуля subprocess , который имеет очень простой способ отправки данных в подпроцесс STDIN и прочтите его STDOUT. https://docs.python.org/2/library/subprocess.html

0
27.01.2020, 21:54

Я думаю, что хорошая практика:

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()
0
27.01.2020, 21:54

Теги

Похожие вопросы