2016-04-04 12 views
2

Я пытаюсь преобразовать скрипт Python 3 в C и затем скомпилировать этот файл C в исполняемый файл.Как использовать Cython для компиляции Python 3 в C

У меня есть этот простой питон скрипт:

def greet(name = ""): 
    print("Hello {0}".format(name if len(name) > 0 else "World")) 

greet("Mango") 

Я превращал этот скрипт в C с помощью:

cython greet.py -o greet.c 

Затем я составил файл C помощью:

cc greet.c -o greet 

После ввода последней команды я получил ошибку:

fatal error: Python.h: No such file or directory compilation terminated.

После того, как я получил ошибку, я вернулся и понял, что я использую Python3 и что я забыл «3» после «cython».
Так перекомпилировано сценарий питона с помощью:

cython3 greet.py -o greet.c 

Затем попытался повторно скомпилировать файл C помощью:

cc greet.c -o greet 

Опять же это не удалось, и бросил ту же ошибку, поэтому я пошел искать на SO и Google и нашел эти вопросы:

Ни один из этих ответов в этих вопросах не работают.

Я убедился, что я установил cython для всех правильных зависимостей, используя apt-get install и pip install печально думал, что он все еще не работает.

+3

install [python-dev] (http://packages.ubuntu.com/search?keywords=python-dev) – Noelkd

+3

Принятый ответ на ваш первый пример вопроса - вы пытались вместо этого выполнить sudo apt-get install python3 -dev'? (примечание 3). В 14.04 вам нужно сделать это, чтобы получить библиотеки dev для py 3 вместо 2. –

+1

@JRichardSnape. Да, я уверен, что при необходимости изменил всю версию python, но я попробую еще раз. –

ответ

6

Проверьте документацию. Недостаточно сделать gcc x.c -o x.

Эта страница объясняет подборку: http://docs.cython.org/src/reference/compilation.html

Там намного больше к нему, но прямой ответ:

Compiling your .c files will vary depending on your operating system. Python documentation for writing extension modules should have some details for your system. Here we give an example on a Linux system:

$ gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o yourmod.so yourmod.c

Конечно, в вашей ситуации это будет что-то ближе к -I/usr/include/python3.4, или даже $(pkg-config --libs --cflags python3). И вы не строите с -shared, потому что вы хотите исполняемый файл.

Кратчайший «это должно работать» набор команд:

cython3 --embed greet.py -o greet.c 
gcc $(pkg-config --libs --cflags python3) greet.c -o greet 

Вам необходимо установить pkg-config, если он отсутствует.

+1

Я использую эту команду: 'gcc -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing /usr/include/python3.4 -o test.so test.c', но я все равно получаю ошибку. –

+1

Если вы получаете ту же ошибку, проверьте, какая версия заголовков вы фактически установили Или вы можете избежать всех особенностей, просто компилируя с помощью 'gcc $ (pkg-config -libs -cflags python3) greet.c -o greet'. Если вы получите сообщение об ошибке« main »вместо этого, вам нужно использовать 'cython3 --embed greet.py'. – viraptor

+1

Ваши инструкции избавлены от всех других ошибок, но один остается «Обязательно указывать имена пакетов в командной строке», а затем он говорит «pyconfig.h нет такого файла или каталога». –

0

Как показано на рисунке @viraptor's answer, ваша главная проблема заключается в том, что вам нужно сообщить своему компилятору C (например,gcc), где требуется найти заголовки python (pyconfig.h и Python.h). Для этого вам необходимо передать -I вариант gcc.

Другой ответ предлагает использовать pkg-config, чтобы добавить это в свою командную строку. Однако, как и вы, с Ubuntu 14.04, cython3 и python3-dev устанавливает, используя этот метод, приводит скомпилированную программу для выхода с ошибкой сегментации для меня.

Итак, я предлагаю вам вернуться к основам. После

cython greet.py -o greet.c 

Выполните следующую команду. Она предполагает, что Python.h и друзья находятся в стандартном месте (т.е. вы сделали стандартную установку python3-dev)

gcc -I/usr/include/python3.4m -o greet greet.c -lpython3.4m 

Если это не сработает - использовать find/-iname Python.h, чтобы найти местоположение необходимых файлов и изменяют -I путь соответственно.

Вовремя, когда вы хотите использовать cython для более сложных программ, таких как те, которые ссылаются на другие библиотеки C, вам нужно узнать о других параметрах, которые необходимо передать, чтобы перейти к gcc, чтобы получить его для компиляции и правильно. Для того, чтобы вы, однако, должны были работать (проверено на Ubuntu 14.04 по вашей спецификации)

P.S. Я не уверен, почему предложение pkg-config не работает, но для меня это добавляет дополнительный путь к -I, который разбивает ситуацию.