我正在尝试在本地运行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一起使用
答案 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
版本比较聪明,并且知道如果没有传递值,则不应创建备份。它不需要空字符串。