SCons:如何在使用VariantDir调用的SConscript中导入Python模块?

5

我的构建结构如下:

SConstruct
subdir/SConscript
subdir/module/__init__.py

SConstruct 调用子目录 subdir/SConscript 作为附属文件:

# SConstruct
SConscript('subdir/SConscript')

subdir/SConscript 导入了 module 模块:

# subdir/SConscript
from module import foo
do SConsy stuff with foo()...

这个方法在我使用variant_dirsubdir/SConscript时出现了问题:

# SConstruct
SConscript('subdir/SConscript', variant_dir='subdir/build', duplicate=0)

问题在于import失败,因为module不再在路径中,而路径已被variant_dir更改。

在SCons或Python中是否有解决此问题的标准方法?我知道有特殊的site_scons目录,但似乎该目录必须存在于根SConstruct的顶层,并且我想将subdir特定的文件保存在subdir下。

3个回答

4

在项目根目录下使用site_scons目录来存放你的模块。例如,我有一个名为xxx的模块,它被放置在:root/site_scons/xxx/__init__.py。现在,我可以在所有的SConscript文件中导入xxx模块。


1
你也可以传递 -I 或 --include-dir 选项给 scons,这允许你指定 Python 模块的路径,但这可能更困难(每次执行 scons 都需要更多的输入),除非你将对 scons 脚本的调用包装在另一个脚本中。 - Brady
谢谢你的回答。我实际上试图避免使用site_scons目录,最终采用了下面的解决方案,但我会接受这个答案。 - Jared Hoberock

3
SConscript中,在import之前,修改Python的路径:
# subdir/SConscript
module_path = Dir('.').srcnode().abspath # get the path to subdir
import sys
sys.path.append(module_path)
from module import foo

谢谢,这真的帮了我很多,因为我无法访问根文件夹,但我想在脚本文件夹中创建单个文件并定义它们。 - Karol Adamiak

0

将PYTHONPATH导出为/path/to/dir_of_modules

这对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接