Fabric - 在本地文件上运行sed

时间:2012-03-18 10:43:50

标签: python sed fabric

我正在尝试在本地运行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 个答案:

答案 0 :(得分:1)

我不知道sed contrib API,但是面料的文档说明了本地函数:

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

修复错误

答案 1 :(得分:0)

我设法通过以下方式使用它:

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

我不确定为什么这可以用额外的''\'来确定含义是什么,但似乎有效。

答案 2 :(得分:0)

据推测,这可以解决您的问题,因为您使用的是Mac OS X(或其他BSD)。

sed的BSD版本要求-i参数具有值。该值应该是sed将用于创建备份的文件扩展名,以防在sed处理期间发生错误并且文件需要回滚到其原始内容。该值也可以是空字符串(''),指示sed不应创建备份文件。

GNU的sed版本比较聪明,并且知道如果没有传递值,则不应创建备份。它不需要空字符串。