如何在SCons操作中转义环境变量?

How to escape an environment variable in a SCons action?

提问人:Piotr Siupa 提问时间:10/21/2023 更新时间:10/21/2023 访问量:24

问:

我有一个运行 Python 脚本的构建命令。 因为 python 命令有时是有时(取决于操作系统),所以我改用我保存在环境变量中的完整路径。pythonpython3

但是,此路径有时会出现奇怪的字符,例如空格,需要转义。 例如,在 Windows 中。.../Program Files/...

SCons 在命令中替换变量时似乎不会自动转义变量。 当我运行这个脚本时:

import sys
env = Environment()
env.Replace(PYTHON_EXECUTABLE=sys.executable)
foo = env.Alias('foo', [], '$PYTHON_EXECUTABLE my-script.py')
env.AlwaysBuild(foo)

我得到:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
C:\Program Files\Python311\python.exe my-script.py
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
scons: *** [foo] Error 1
scons: building terminated because of errors.

我不想将路径放在双引号中,因为它们仍然允许在 Linux 上扩展某些字符。 另一方面,Windows 不支持单引号。

有没有简单的可移植方法可以转义命令的一部分,而不管有什么字符?

Python shell 转义 SCON

评论


答:

2赞 Piotr Siupa 10/21/2023 #1

SCons 提供了一个转义函数,它似乎完全可以满足您的需求。

它是在环境变量 ESCAPE 中预定义的,可以在操作字符串中调用,如下所示: .${ESCAPE(YOUR_VARIABLE)}

脚本的固定版本

import sys
env = Environment()
env.Replace(PYTHON_EXECUTABLE=sys.executable)
foo = env.Alias('foo', [], '${ESCAPE(PYTHON_EXECUTABLE)} my-script.py')
env.AlwaysBuild(foo)