Допустим, я хочу использовать gcc
из командной строки, чтобы скомпилировать расширение C для Python. Я бы структурировал вызов примерно так:
gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c
Я заметил, что параметры -I
, -L
и -l
абсолютно необходимы, иначе вы получите ошибку, которая выглядит примерно так: это. Эти команды сообщают gcc, где искать заголовки (-I
), где искать статические библиотеки (-L
) и какую статическую библиотеку на самом деле использовать (python35
, что на самом деле переводится как libpython35.a
).
Теперь, очевидно, очень легко получить каталоги libs
и include
, если это ваша машина, поскольку они никогда не меняются, если вы этого не хотите. Однако я писал программу, которая вызывает gcc
из командной строки, которую будут использовать другие люди. Строка, в которой происходит этот вызов, выглядит примерно так:
from subprocess import call
import sys
filename = applesauce.c
include_directory = os.path.join(sys.exec_prefix, 'include')
libs_directory = os.path.join(sys.exec_prefix, 'libs')
call(['gcc', ..., '-I', include_direcory, '-L', libs_directory, ...])
Однако у других будут другие платформы и другие структуры установки Python, поэтому простое объединение путей не всегда будет работать.
Вместо этого мне нужно решение внутри Python, которое будет надежно возвращать каталоги include
и libs
.
Редактировать:
Я просмотрел модуль distutils.ccompiler
и нашел много полезных функций, которые частично используют distutils, но делают его настраиваемым для меня, чтобы сделать мой компилятор полностью кроссплатформенным. Единственное, мне нужно передать библиотеки include и runtime...
Редактировать 2:
Я посмотрел на distutils.sysconfig
и могу надежно вернуть каталог «include», включая все файлы заголовков. Я до сих пор не знаю, как получить библиотеку времени выполнения.
Документы distutils.ccompiler
находятся здесь
Программа, которой нужна эта функциональность, называется Cyther.