2015-10-10 37 views
0

在Wesnoth构建的这段代码中,$ TESTFILE变量被替换为给定的路径。但在Windows路径变得无效,因为默认情况下,SCons subst()不会在路径中转义反斜杠。有没有办法做到这一点 - 获取SCons File节点的绝对文件名与逃脱反斜杠?或者在代替时逃避反斜杠?SCons中的转义替换路径

test_program = ''' 
    #include <SDL_mixer.h> 
    #include <stdlib.h> 

    int main(int argc, char **argv) 
    { 
     Mix_Music* music = Mix_LoadMUS("$TESTFILE"); 
     if (music == NULL) { 
      exit(1); 
     } 
     exit(0); 
    } 
\n 
''' 
print Environment(TESTFILE = File("data/core/music/main_menu.ogg").rfile().abspath). \ 
      subst(test_program) 

输出:

#include <SDL_mixer.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    Mix_Music* music = Mix_LoadMUS("E:\wesnoth\scons\data\core\music\main_menu.ogg"); 
    if (music == NULL) { 
     exit(1); 
    } 
    exit(0); 
} 

回答

0

蟒蛇如何os.path.normpath 2.7文档..?

os.path.normpath(路径)

通过折叠冗余 分离器和上一级的引用归一路径名,使得甲// B,A/B /,A /./ B和 A/foo /../ B全部成为A/B。此字符串操作可能会更改包含符号链接的路径的含义。在Windows上,它将 将正斜杠转换为反斜杠。要标准化案例,请使用 normcase()。

+0

不,normpath在这里没有帮助。 –

+0

'os.path.normpath(File(“data/core/music/main_menu.ogg”)。rfile()。abspath)'没有帮助。 –

+0

这是什么产生的? – bdbaddog

0

在克隆Wesnoth回购并检查实际构建文件后,我发现您描述的问题发生在配置上下文中。这在你的原始问题中没有清楚,并且使我的第一次尝试回答无用(使用Substfile构建器,请参阅历史记录)。 据我所知,目前SCons没有内置选项来处理您要查找的双反斜杠。我现在可以想到的最简洁的方法是克隆方法SConf.SConfBase.TryRun(例如,将其命名为TryRunWithArgs),使其接受附加程序参数,将其添加到配置上下文中,然后重写测试程序,使其接受文件名作为第一个论点。

+0

修正了额外的锯齿https://github.com/wesnoth/wesnoth/commit/c001f661f0810c78df3c3ea1e57c54d8a9c1169e –