2014-12-15 4 views
5

Мне хорошо известно множество возможностей, которые позволяют C-коду запускать код Python и наоборот (Cython, Boost.Python, ...). Однако, если я ошибаюсь, все эти подходы просто «назовут» соответствующие скрипты python и управляют взаимодействиями между программой C и скриптом python. Поэтому требуется установка python.Скомпилировать код python и связать его с программой на C++?

В моей ситуации я бы хотел создать автономное решение, где мой код python можно каким-то образом скомпилировать и связать с моей основной программой на C++. У меня были надежды с Cython, так как это позволило мне скомпилировать мой скрипт и создать файл .so. Тем не менее, я, похоже, не смог «связать» этот файл .so с моей программой на C++. Я попытался сделать следующее:

Простой скрипт python, содержащий функцию multiply (a, b), которая возвращает a * b; Я создал файл libmultiply.so, используя cython. Короткий файл Cpp, который выводит результат умножения (5,2):

int multiply(int, int); 

int main() 
{ 
    std::cout << multiply(5,2) << std::endl; 
} 

Я строю, выполнив: г ++ test.cpp -L/дома/Джером/-lmultiply

Что дает меня ошибка:

test.cpp:(.text+0x2b): undefined reference to `multiply(int, int)' 
collect2: error: ld returned 1 exit status 

Я не уверен, что я пытался имеет смысл, но мы надеемся, что это дает вам представление о том, что я хотел бы достичь.

+0

Cython не может этого сделать. Он выводит код, который ссылается на API Python/C. Если этот API не доступен, все, что вы построите из Cython, не сработает. Это также (AFAIK) делает довольно агрессивное название. – Kevin

+0

Вы не можете «скомпилировать» код Python; он работает с виртуальной машины. Однако вы можете «заморозить» его, с чем-то вроде «[PyInstaller] (https://pypi.python.org/pypi/PyInstaller)» (который может создавать библиотеки DLL/SO). Это то, что вы пытаетесь сделать? Или, может быть, [[пытается понять процедуру связывания для написания гибрида python/c] (http://stackoverflow.com/questions/9826311/trying-to-understand-linking-procedure-for-writing-python-c-hybrid?rq = 1) ". –

+1

@snotwaffle Вы можете скомпилировать его. Вам просто нужно написать компилятор :-) (так как я не знаю того, который легко доступен). –

ответ

2

Shed Skin - ближайшая вещь, которую я мог найти. Он компилирует типизированное подмножество Python в C++. Наверное, не такой надежный, как хотелось бы, но это странный вариант использования. Если вам нравится писать что-то самостоятельно, вы можете посмотреть на LLVM, который использовался для создания вещей, похожих на то, что вы хотите.

Edit 1:

Я только что нашел этот список удивительных вещей питона на GitHub, Awesome-python, и ссылки на Pyston, который является реализацией питон LLVM. Может быть, лучше подходит для того, что вы хотите, или отправной точкой для Python для C++-моста.

Смежные вопросы