Как правильно настроить библиотеку python / c?

1

Я пытаюсь получить библиотеку 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, но кто-нибудь знает, что это такое?

  • 0
    Какие ошибки он вернул?
  • 0
    msgstr "неопределенная ссылка на <имя функции>", где каждый вызов функции python давал одну и ту же ошибку.
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ

Я сделал какой-то хитрый 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? Если это так, посмотрите на более полную документацию здесь.

  • 0
    да, я помещаю это в основную функцию. Я зашел так далеко в C :) Я забыл вставить его с другим кодом
  • 0
    @Bartvbl: Просто проверяю! Как я уже спросил в своем редактировании (к сожалению, приурочено: D), какова цель кода? Почему вы используете Python API?
Показать ещё 3 комментария
1

Я добился определенного прогресса, так как я задал свой вопрос, и я подумал, что просто поделюсь им, если у кого-то возникают подобные проблемы.

Это были ошибки, которые я получил:

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.., вы можете указать расположение файла библиотеки на вкладке настроек компоновщика. Когда вы закончите, создайте проект, и он, надеюсь, будет работать.

Я надеюсь, что кто-то, кто борется с подобными проблемами, поможет в этом:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню