Избегать экранирования знака доллара в подкоманде? - PullRequest
0 голосов
/ 17 октября 2019

Мне нужно обработать файл и немедленно загрузить его куда-нибудь. Рассмотрите пример и представьте, что мы делаем aws s3 cp - s3://some-path/$FILE вместо вызова dd:

from plumbum.cmd import split, seq, rev, dd
my_filter = (rev | dd['of=$FILE'])
cmd = seq['1', '10'] | split['--filter', str(my_filter)]

Учитывая, что $ FILE не передается напрямую, а экранируется, подкоманда в split создает файл с именем$FILE. Как я могу сделать так, чтобы он НЕ избегал выражения доллара, а принимал его дословно?

1 Ответ

0 голосов
/ 17 октября 2019

В качестве временного решения я решил сделать monkey-patch plumbum s shquote:

from plumbum.cmd import split, seq, rev, dd

import plumbum
import unittest.mock as mock
# HACK: disable quoting of every argument in shquote
# otherwise we'd get --filter="dd 'of=$FILE'"
# which would create a file named $FILE anyway
with mock.patch('plumbum.commands.base.shquote', lambda x: x):
    my_filter = str(rev | dd['of=$FILE'])

funnychars_new = plumbum.commands.base._funnychars.replace('$', '')
# HACK: don't treat dollar sign as an escapeable character
with mock.patch('plumbum.commands.base._funnychars', funnychars_new):
    cmd = seq['1', '10'] | split['--filter', my_filter]
    print(cmd)
    cmd & plumbum.FG

Поставив это перед выполнением команды, я решил проблему, но я бы приветствовал другое решение.

...