如果我有一个在运行时加载文本文件的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程序从安装目录中读取内核源代码?你知道吗
与Python模块一样,Python C扩展也会得到一个
__file__
属性,但只有在模块初始化函数返回后才返回(通过在Python 2.7.3中对Debian Wheezy进行测试确定)。在完全初始化的C扩展中,只需使用PyObject_GetAttrString(module, "__file__")
检索此路径,然后对其执行操作。(您可能希望将从Py_InitModule()
返回的指针保存到模块级全局,以便在需要时使用它)但是,您可能会发现在包中至少有一个纯Python模块更易于维护。它甚至可以在完成加载之前使用自己的
__file__
,并且可以更方便地使用os.path
操作来形成要对其进行操作的文件名的名称。最后,这是有利的,因为如果合适的话,您可以允许库的客户机选择不同的OpenCL内核。你知道吗相关问题 更多 >
编程相关推荐