如何存储Python C扩展中的文本文件

时间:2014-04-30 20:33:42

标签: python c installation

如果我有一个在运行时加载文本文件的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程序从安装目录中读取内核源代码?

1 个答案:

答案 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内核。