【发布时间】:2014-11-17 14:02:39
【问题描述】:
我使用 SCons 作为软件构建工具。我想解压第 3 方软件。我正在使用 UnTarBuilder 执行此操作,代码与给定的 here 相同。
这是我的 SConstruct 文件的一部分:
def tarContentsEmitter(target, source, env):
import tarfile
sourceTar = tarfile.open(source[0].name,'r')
tarContents = sourceTar.getmembers()
tarFileContents = filter(lambda tarEntry: tarEntry.isfile(), tarContents)
newTargets = map(tarInfoToNode, tarFileContents)
sourceTar.close()
return (newTargets, source)
def tarInfoToNode(tarInfoObject):
return File(tarInfoObject.name)
def UnTar(target, source, env):
# Code to build "target" from "source" here
import tarfile
sourceTar = tarfile.open(source[0].name,'r')
sourceTar.extractall()
sourceTar.close()
return None
def UnTarString(target, source, env):
""" Information string for UnTar """
return 'Extracting %s' % os.path.basename
(str (source[0]))
unTarBuilder = Builder(action=SCons.Action.Action(UnTar, UnTarString),
src_suffix='.tar.bz2',
emitter=tarContentsEmitter)
env.Append(BUILDERS = {'UnTar' : unTarBuilder})
env.UnTar(source='curl-7.37.0')
我收到以下错误:
scons: Reading SConscript files ...
TypeError: __init__() takes exactly 4 arguments (2 given):
File "/home/nikhil/mnt/work/trunk/SConstruct", line 100:
env.UnTar(source='curl-7.37.0.tar.bz2')
File "/usr/lib/scons/SCons/Environment.py", line 259:
return MethodWrapper.__call__(self, target, source, *args, **kw)
File "/usr/lib/scons/SCons/Environment.py", line 223:
return self.method(*nargs, **kwargs)
File "/usr/lib/scons/SCons/Builder.py", line 632:
return self._execute(env, target, source, OverrideWarner(kw), ekw)
File "/usr/lib/scons/SCons/Builder.py", line 553:
tlist, slist = self._create_nodes(env, target, source)
File "/usr/lib/scons/SCons/Builder.py", line 517:
target, source = self.emitter(target=tlist, source=slist, env=env)
File "/home/nikhil/mnt/work/trunk/SConstruct", line 75:
newTargets = map(tarInfoToNode, tarFileContents)
File "/home/nikhil/mnt/work/trunk/SConstruct", line 80:
return File(tarInfoObject.name)
我知道 UnTar 需要 target 和 env,但我不确定我是否错过了其他内容,因为他们会在上面提到的链接中更正,因为这很简单(我不是 python 人)
【问题讨论】:
-
我认为这与您的问题无关,但您的
UnTarString函数在os.path.basename和(str (source[0]))之间有一个换行符。我认为这会改变你的脚本的行为。您可能应该将它们放在同一行。