Fabric - Запуск sed на локальном файле - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь запустить sed для файла локально, вот мой код:

from fabric.api import *
from fabric.contrib.files import sed
import os.path

def init(project, repository=None): 
    repository = project if not repository else repository
    folder = os.path.join(os.path.dirname(__file__), repository)

    local('cp -R bin/* %s' % folder)

    with lcd(folder):
        sed('wsgi.py', '{PROJECTNAME}', project)

Затем мне предлагается указать хост. Есть ли способ, которым я могу запустить Sed локально, как это? Я также попробовал:

local("sed -i \'s/{PROJECTNAME}/%s/\' wsgi.py" % project)

Но я получаю следующую ошибку:

sed: -i не может использоваться с stdin

Ответы [ 3 ]

2 голосов
/ 18 марта 2012

Я не знаю API sed contrib, но в документации фабрики говорится о локальной функции:

local is simply a convenience wrapper around the use of the builtin Python subprocess module with shell=True activated. If you need to do anything special, consider using the subprocess module directly.

Поэтому я предлагаю вам просто позвонить subprocess.call() с shell=False, это, вероятно, должно исправить ошибку с sed -i

0 голосов
/ 31 марта 2015

Предположительно, причина, по которой эта проблема решается, заключается в том, что вы используете Mac OS X (или другой BSD).

Версия BSD sed требует, чтобы аргумент -i имел значение. Это значение должно быть расширением файла, которое sed будет использовать для создания резервной копии, если во время обработки sed произойдет ошибка, и файл необходимо будет откатить до его исходного содержимого. Значением также может быть пустая строка (''), указывающая sed, что файл резервной копии не следует создавать.

Версия GNU sed умнее и знает, что, если значение не передается, резервное копирование создавать не следует. Это не нуждается в пустой строке.

0 голосов
/ 18 марта 2012

Мне удалось заставить это работать, используя следующее:

local("sed -i \'\' -e\'s/{PROJECTNAME}/%s/\' wsgi.py" % project)

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

...