Python .format не работает должным образом - PullRequest
0 голосов
/ 01 июня 2018

Это не имеет смысла для меня.Я определяю 5 переменных:

a='a'
b='b'
c='c'
d='d'
e='e'

Затем я пытаюсь построить команду, используя эти переменные:

command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> " .format(a,b,c,d,e)

Это работает, как и ожидалось, с полученной командой:

"for i in \\`python a_getSyslogs.py b c d\\`\ndo\ngunzip -c d/\\$i | egrep -i 'e' >> "

Что меня порадует, если я добавлю еще один компонент в строку (т. Е. "Test"), все рухнет в том, что больше не будет подмены:

command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> " + "test" .format(a,b,c,d,e)

Полученная командавыглядит следующим образом:

"for i in \\`python {0}_getSyslogs.py {1} {2} {3}\\`\ndo\ngunzip -c {3}/\\$i | egrep -i '{4}' >> test"

Вероятно, это проблема "не вижу леса сквозь деревья", но я пробовал все виды различных комбинаций, и ничего не помогло.

Я использую Python 2.7.10 в CentOS:

sys.version '2.7.10 (по умолчанию, 6 октября 2017 г., 22:29:07) \ n [GCC 4.2.1 Совместимый Apple LLVM 9.0.0 (clang-900.0.31)] '

Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Где это возможно, не пытайтесь заполнить шаблон строки для построения команды, так как вы вряд ли получите правильное цитирование.Вместо этого сделайте как можно больше в Python, используя модуль subprocess, где это необходимо.

from subprocess import Popen, call, PIPE

def processFile(name, pattern, output):
    p = Popen(["gunzip", "-c", name], stdout=PIPE)
    call(["egrep", "-i", pattern], stdin=p1.stdout, stdout=output)

with open("test", "w") as fh:
    p = Popen(["python", "{0}_getSyslogs.py".format(a), b, c, d], stdout=PIPE)
    for x in p.stdout:
        x = x.strip()
        processFile(os.path.join(d, x), e, fh)
0 голосов
/ 01 июня 2018

Почему бы просто,

"... >> test".format(a,b,c,d,e)

вместо

"... >> " + "test".format(a,b,c,d,e)

.format применимо только к одному string объекту, и вы применяете его к "test".

Если вы действительно хотите объединить две строки, сначала сохраните их в переменной, а затем сделайте то, что вам нужно.

str1 = "example{} " + "test"
str1.format('3')
# example3 test
0 голосов
/ 01 июня 2018

Попробуйте это: (command+"test").format(a,b,c,d,e) т.е. поместите его в скобки.Ваш текущий подход использует формат только на "test"

0 голосов
/ 01 июня 2018

Вы применяете функцию format только для строки "test".

Попробуйте:

command = "for i in \`python {0}_getSyslogs.py {1} {2} {3}\`\ndo\ngunzip -c {3}/\$i | egrep -i '{4}' >> test" .format(a,b,c,d,e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...