Как мне надежно использовать менеджер контекста cd () Fabri c - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь запустить команду поиска в каталоге удаленной системы. Fabri c иногда меняет каталог, но иногда это не удается, в зависимости от того, содержит ли путь круглые скобки или пробелы и использую я shlex.quote () или нет. Как правильно с этим справиться?

Мой код в основном таков:

from shlex import quote
from fabric import Connection

with Connection(remote_login) as c:
    with c.cd(quote(node.src)):    # Condition 1
    # with c.cd(node.src):         # Condition 2
        result = c.run(r"nice find -maxdepth 1 -type f -printf '%f\n'", echo=True)

Если я использую условие 1, оно будет успешным, если путь содержит скобки. Fabri c генерирует эту строку в этом случае:

# Fabric output success with parens in path
cd '/data/PixelSizeTestRuby105mm(Zoom248.5mm)' && nice find -maxdepth 1 -type f -printf '%f\n'

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

# Fabric output failure for spaces in path
cd '/data/Crystal\ Bending\ Test/Bending0' && nice find -maxdepth 1 -type f -printf '%f\n'
sh: line 0: cd: /data/Crystal\ Bending\ Test/Bending0: No such file or directory

Если я вместо этого использую Условие 2, оно не выполняется для первого пути и успешно выполняется для второго.

# Fabric output failure for parens in path
cd /data/PixelSizeTestRuby105mm(Zoom248.5mm) && nice find -maxdepth 1 -type f -printf '%f\n'
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `cd /data/PixelSizeTestRuby105mm(Zoom248.5mm) && nice find -maxdepth 1 -type f -printf '%f\n''

1 Ответ

2 голосов
/ 03 августа 2020

Это ошибка в реализации Invoke . Он просто не выполняет правильное экранирование аргументов оболочки для путей в cd.

В качестве быстрого исправления вы можете вручную избежать скобок в своем пути, добавив перед ним backsla sh. Использование shlex.quote не сработает, как вы сами заметили. В идеале реализация Invoke должна быть исправлена ​​для использования shlex.quote внутри, а не специального c, ошибочного ручного выхода, который он выполняет в настоящее время.

...