Я пытаюсь получить библиотеку python/c как мой компилятор mingW. Python онлайн-докупка; http://docs.python.org/c-api/intro.html#include-files только упоминает, что мне нужно импортировать файл python.h. Я схватил его из каталога установки (как это требуется на платформе Windows) и протестировал его, скомпилировав script: #include "Python.h"
. Это скомпилировано. Затем я опробовал фрагмент кода, показанный ниже на странице API python/c:
PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));
По какой-то причине компилятор должен скомпилировать код, если я удалю последние 4 строки (так что останется только определение переменной pyObject), но вызов фактический конструктор возвращаемых кортежей ошибок.
Мне, вероятно, не хватает чего-то совершенно очевидного здесь, учитывая, что я очень новичок в C, но кто-нибудь знает, что это такое?
Я сделал какой-то хитрый Googling, и если вы получаете ошибки на этапе компоновщика (сообщения об ошибках могут иметь шестнадцатеричные строки или ссылки на ld
), вам может потребоваться убедиться, что библиотека Python, которая поставляется с Версия Windows была преобразована в формат, который GCC (MinGW) может читать; см. здесь, среди других сайтов. Также убедитесь, что GCC может найти и использовать файл библиотеки, если это необходимо, используя -L/my/directory
и -lpython26
(соответствующим образом заменив ваш путь и версию Python).
Если ошибки находятся на этапе компиляции (если номера строк указаны в сообщениях), убедитесь, что вам не нужно добавлять какие-либо другие каталоги в путь поиска include. Python может (я не использовал свой C API) включать другие файлы заголовков в Python.h
, которые хранятся в другом каталоге. Если это так, используйте флаг -I/my/directory/
для GCC, чтобы он также туда искал.
Точные (скопированные и скопированные) сообщения об ошибках могли бы помочь.
Предупреждение. Текст ниже не отвечает на вопрос!
Вы поместили код внутри функции? Попробуйте поместить его в main
, например:
int main(int argc, char *argv[]) {
PyObject *t;
t = PyTuple_New(3);
PyTuple_SetItem(t, 0, PyInt_FromLong(1L));
PyTuple_SetItem(t, 1, PyInt_FromLong(2L));
PyTuple_SetItem(t, 2, PyString_FromString("three"));
return 0;
}
Этот код будет запущен при выполнении программы. Затем вы можете использовать любые другие методы для проверки содержимого кортежа. Если он не запускается отдельно в качестве исполняемой программы, тогда придерживайтесь его по-другому; Я предполагаю, что у вас есть другой способ вызвать функцию.
Определение PyObject *t;
действует вне функции как определение глобальной переменной, а также внутри функции, объявляя ее как локальную переменную. Остальные четыре строки - это вызовы функций, которые должны быть внутри другой функции.
Вышеприведенный код сам по себе не делает программу. Вы пытаетесь написать расширение C на Python? Если это так, посмотрите на более полную документацию здесь.
Я добился определенного прогресса, так как я задал свой вопрос, и я подумал, что просто поделюсь им, если у кого-то возникают подобные проблемы.
Это были ошибки, которые я получил:
In function `main':
undefined reference to `_imp__PyTuple_New'
undefined reference to `_imp__PyInt_FromLong'
undefined reference to `_imp__PyTuple_SetItem'
undefined reference to `_imp__PyInt_FromLong'
undefined reference to `_imp__PyTuple_SetItem'
undefined reference to `_imp__PyString_FromString'
undefined reference to `_imp__PyTuple_SetItem'
Ошибки, которые я получил, были результатом отсутствия библиотек из компилятора mingW. Таким образом, только включение файла заголовка в исходном ode недостаточно, есть также специальный файл, требуемый (.lib,.o,.a,..), который должен быть включен для компиляции. В командной строке mingW можно использовать флаг -l [path], но я обнаружил, что codeBlocks (http://www.codeblocks.org/) является наиболее удобно использовать здесь. После создания проекта и перехода к Project > Build options.., вы можете указать расположение файла библиотеки на вкладке настроек компоновщика. Когда вы закончите, создайте проект, и он, надеюсь, будет работать.
Я надеюсь, что кто-то, кто борется с подобными проблемами, поможет в этом:)