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

2024-04-25 15:17:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件src目录源代码clmysetupextension
1条回答
网友
1楼 · 发布于 2024-04-25 15:17:33

与Python模块一样,Python C扩展也会得到一个__file__属性,但只有在模块初始化函数返回后才返回(通过在Python 2.7.3中对Debian Wheezy进行测试确定)。在完全初始化的C扩展中,只需使用PyObject_GetAttrString(module, "__file__")检索此路径,然后对其执行操作。(您可能希望将从Py_InitModule()返回的指针保存到模块级全局,以便在需要时使用它)

但是,您可能会发现在包中至少有一个纯Python模块更易于维护。它甚至可以在完成加载之前使用自己的__file__,并且可以更方便地使用os.path操作来形成要对其进行操作的文件名的名称。最后,这是有利的,因为如果合适的话,您可以允许库的客户机选择不同的OpenCL内核。你知道吗

相关问题 更多 >