Расширения сценариев установки Python, как включить файл .h? - PullRequest
9 голосов
/ 23 ноября 2010

Итак, у меня есть каталог, который выглядит примерно так:

 home\
     setup.py
     some_python_file.py
     ext\
         __init__.py
         c_file1.c
         c_file2.c
         ext_header.h

Очевидно, что файл заголовка необходим для компиляции файлов c, но проблема в том, что я не могу заставить скрипт установки включить файл заголовка.

Мой объект расширения выглядит примерно так:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c'])

Что работает, но не включает файл заголовка. Если я изменю это на:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c', 'ext_header.h'])

Включает файл .h, но не запускается при запуске install. Вместо этого выдает и ошибку error: unknown file type '.h' (from 'ext/ext_header.h')

Если я включу заголовочный файл в файл данных, например так:

data_files=[('ext', ['ext/ext_header.h'])]

он вообще не работает, файл .h даже не превращается в файл MANIFEST.

Итак, моя проблема в том, как включить это расширение в файл заголовка, чтобы python setup.py install правильно его построило?

Ответы [ 2 ]

8 голосов
/ 23 ноября 2010

У меня такое чувство, что pyfunc находится на пути к более стандартному решению, но я нашел другое решение самостоятельно.Я понятия не имею, если это хорошее решение или просто взломать, но все, что я сделал, это добавил файл заголовка в MANIFEST.in.Документация не дает понять, что это именно то, для чего нужен файл MANIFEST.in, но он работает.Мой файл MANIFEST.in теперь выглядит так:

include ext/ext_header.h

Включает файл и успешно компилируется при запуске python setup.py install

2 голосов
/ 23 ноября 2010

Из документов

module1 = Extension('demo',
                define_macros = [('MAJOR_VERSION', '1'),
                                 ('MINOR_VERSION', '0')],
                include_dirs = ['/usr/local/include'],
                libraries = ['tcl83'],
                library_dirs = ['/usr/local/lib'],
                sources = ['demo.c'])

Вы должны предоставить включаемые файлы через "include_dirs".

Почему это не работает для вас?

...