Я хочу вызвать скрипт Python, script1.py , который принимает в качестве аргумента строку регулярного выражения. Затем этот скрипт подключается к другому серверу и вызывает script2.py .
script1.py
regex = sys.argv[1]
log = os.popen('ssh otherserver python /home/log/scripts/script2.py \"%s\"' % regex)
for line in log:
print line.strip()
log.close()
script2.py
regex = re.compile(sys.argv[1])
for line in ['[1','[ 2]',' a ']:
if regex.search(line):
print line.strip()
Проблема, с которой я сталкиваюсь, заключается в том, что скобки нарушают работу скрипта при запуске через SSH.
Это работает:
[foo @ bar scripts] $ python script1.py ". *"
[1
[2]
а
Это не:
[foo @ bar scripts] $ python script1.py "(. *)"
bash: -c: строка 0: синтаксическая ошибка рядом с неожиданным токеном ('<br>
bash: -c: line 0:
python /home/log/scripts/script2.py (. *) '
Почему аргумент во втором примере не экранирован? Этого не происходит, если я вызываю script2.py локально без SSH.
Обновление с решением:
Оказывается, что решение использовало подпроцесс, но передача аргументов не работала, поэтому мне пришлось отформатировать последний аргумент, чтобы включить экранированное регулярное выражение:
log = subprocess.check_output(['ssh', 'eu1', 'nice', 'python', '/home/log/scripts/script2.py \"%s\"' % regex])
print log.strip()