如果我有一个在运行时加载文本文件的C扩展名,比如说对于OpenCL内核,我怎样才能让C扩展在运行时读取文件而不必将其作为变量传递?目前,我有一个用于以下目录布局的安装脚本,
|-myproj/
|-kernels/
|-kernel1.cl
|-src/
|-srcFile1.c
...
|-headers/
|-header1.c
...
|-setup.py
和设置文件状态
my_extension = Extension("myproj",
include_dirs = ["headers"],
libraries = ["OpenCL"],
sources = ["src/srcFile1.c", ...])
setup(name = "myproj",
version = "0.0.1",
ext_modules = [my_extension],
data_files = [('kernels', ['kernels/kernel1.cl', ...])])
现在,在我加载内核源代码的C源代码中,我打印了当前的工作目录。它不是二进制文件的目录,而是运行python的目录的目录。有没有办法让c程序从安装目录中读取内核源代码?
答案 0 :(得分:0)
就像Python模块一样,Python C Extensions获得__file__
属性,但只有在之后才会返回模块初始化函数(通过在Debian Wheezy上的Python 2.7.3中测试确定)。在完全初始化的C扩展中,您只需使用PyObject_GetAttrString(module, "__file__")
来检索此路径,然后对其进行操作。 (您可能希望将从Py_InitModule()
返回的指针保存到模块级全局,以便在需要时将其保存)
但是,您可能会发现在程序包中至少有一个纯Python模块更易于维护。它甚至可以在加载之前使用它自己的__file__
,它可以更方便地使用os.path
操作来形成您要操作的文件名的名称。最后,它是有利的,因为如果合适,您可以允许库的客户端选择不同的OpenCL内核。