1

我有一个与 Boost.Python 一起使用的 Jamfile 来包装一些 C++ 类。我让 Jamfile 自动运行 python 脚本并将扩展加载为编译后步骤:

rule run-test ( test-name : sources + )
{
    import testing ;
    testing.make-test run-pyd : $(sources) : : $(test-name) ;
}

然后:

PROJECT_NAME = example ;
run-test $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py ;

这将构建 example_ext.so,然后运行 ​​test_example_ext.py,它会执行一个简单的“import example_ext”,然后进行一些基本测试。

问题是我需要 test_example_ext.py 才能从其他包中导入一些 Python 模块,所以我需要设置 PYTHONPATH。从命令行来看,这不是问题,但即使导出,bjam 似乎也不会将其传递到其衍生的 Python 进程中。

在这种情况下,我正在寻找相当于:

$ export PYTHONPATH=..

即设置Python 搜索路径比我运行bjam 高一级。

我设法得到的最接近的是弄清楚这可以满足我的要求:

$ bjam pythonpath=..

这实际上有效。但我想在 Jamfile 中设置它,而不是依赖命令行。我读过 bjam 手册,上面说这是一个属性,我可以在<pythonpath>..某个地方使用。但它没有说在哪里。

所以我的问题是我不知道如何在 Jamfile中指定这个属性。它去哪儿了?语法是什么?它是 user-config.jam 中“import python ;”或“using python ...”的一部分,还是 run-pyd 甚至 python-extension 规则的一部分?我已经随机尝试了所有这些,但没有理解或成功。

boost_1_50_0/tools/build/v2/tools/python.jam我发现:

# pythonpath 特性为 PYTHONPATH # 环境变量指定附加元素
,由 run-pyd 设置。例如,pythonpath 可用于
# 访问作为正在构建的产品的一部分但未
安装在开发系统的默认路径中的 Python 模块。
feature.feature pythonpath :: 免费的可选路径;

这似乎是在声明“pythonpath”属性(又名功能),但在什么上下文中?它可以在哪里以及如何使用?

这个页面演示了如何按照这些思路定义一个属性,而不是真正如何或在哪里使用它。

4

1 回答 1

3

我相信我可能已经找到了自己问题的答案。

解决方案似乎是project下面的规则,带有requirements关键字,虽然我还不明白它为什么起作用,或者指定它的含义。

这是我的 Jamfile:

PROJECT_NAME = 示例;

导入蟒蛇;

# 在执行运行测试时设置 PYTHONPATH
项目:要求<pythonpath>..;

蟒蛇扩展 $(PROJECT_NAME)_ext :
  $(PROJECT_NAME).cpp
  $(PROJECT_NAME)_ext.cpp
:
;

# 声明测试目标
运行测试 $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py ;

为了完整起见,我实际上在一个目录中提取了一个 Jamroot 文件,如下所示:

导入蟒蛇;

# 指定Boost项目的路径。如果你移动这个项目,
# 调整此路径以引用 Boost 根目录。
使用项目提升
  : 。/促进 ;

# 设置所有项目都使用的项目范围的需求
# 全局 ID 为的项目中的 boost_python 库
# /升压/蟒蛇。
项目
  : 要求 <library>/boost/python//boost_python ;

# 一个小“规则”(函数)来清理声明测试的语法
# 这些扩展模块。
规则运行测试(测试名称:来源+)
{
    进口检测;
    testing.make-test run-pyd : $(sources) : : $(test-name) ;
}
于 2012-09-04T11:49:14.803 回答