2015-10-07 4 views
3

Я пишу C-расширения для python. Я просто экспериментировал на некоторое время, и я написал мировое расширение привета который выглядит следующим образом:с использованием расширения C в python, не устанавливая его как модуль

#include <Python2.7/Python.h> 

static PyObject* helloworld(PyObject* self) 
{ 
    return Py_BuildValue("s", "Hello, Python extensions!!"); 
} 

static char helloworld_docs[] = "helloworld(): Any message you want to put here!!\n"; 

static PyMethodDef helloworld_funcs[] = { 
    {"helloworld", (PyCFunction)helloworld, METH_NOARGS, helloworld_docs}, 
    {NULL,NULL,0,NULL} 
}; 

void inithelloworld(void) 
{ 
    Py_InitModule3("helloworld", helloworld_funcs,"Extension module example!"); 
} 

код отлично работает, после установки его из setup.py файла, который я написал, и установить его из Командная строка

python setup.py install 

То, что я хочу следующее:

Я хочу использовать файл C в качестве модуля расширения питона, не устанавливая его, что я хочу, чтобы использовать его как еще один файл питона мой проект, а не файл, который мне нужно установить до моего Модули python используют свою функциональность. Есть ли способ сделать это?

+1

Можете ли вы подробно рассказать о том, чего вы хотите достичь? Модуль расширения - это просто общая библиотека, которую может загружать Python. «Установка» это просто означает копирование его в место, где Python ищет свои модули. Вы хотите, чтобы вы запускали свой модуль из не-системного места? Или вы не хотите не полагаться на 'setup.py' и вместо этого устанавливать (копировать) модуль расширения вручную? – user4815162342

+0

Он должен будет существовать на платформе где-то, так что вы можете уточнить, что вы имеете в виду, когда заявляете, что не хотите его устанавливать? –

+0

Я хочу использовать его как еще один файл python в моем проекте, а не файл, который мне нужно установить до того, как мои другие модули python в моем проекте получат возможность использовать его функциональность. – ironstein

ответ

1

Вы можете просто скомпилировать расширение без установки (обычно что-то вроде python setup.py build). Затем вы должны убедиться, что интерпретатор может найти скомпилированный модуль (например, скопировав его рядом со сценарием, который импортирует его, или установкой PYTHONPATH).

+0

Я не думаю, что это решение, так как вы должны убедиться, что python найдет ваш модуль, а это значит, вы должны установить его в конце или, по крайней мере, расширить свой «путь». –

+0

@hmn Я построил расширение, используя python setup.py build, и дал мне общие библиотеки (.so-файлы) для mac osx 10.6 и mac osx 10.10 в двух разных папках. Если бы я хотел использовать свое скомпилированное расширение для окон, как бы я это сделал? а также как я его построил, как мне использовать общую библиотеку? – ironstein

+0

@ironstein Вы не можете использовать модули, скомпилированные для Mac в Windows. Модули расширения C должны быть скомпилированы для целевой системы и версии Python, которая должна их использовать. – BlackJack

0

Вы можете создать свой «собственный интерпретатор», не расширяя питон, но вставляя его в свое приложение. Таким образом, ваши объекты будут всегда доступны для пользователей, которые запускают вашу программу. В некоторых случаях это довольно обычная вещь, например, посмотрите проект Blender, в котором все модули bpy, bmesh и bge уже включены.

Недостатком является то, что ваши пользователи не могут использовать команду python, вместо этого они должны использовать ваш hello_world_python. (Но, конечно, вы также можете предоставить свое расширение как модуль.) И это также означает, что вы должны компилировать и распространять свое приложение для всех платформ, которые хотите поддерживать, - если вы хотите распространять его как двоичный, чтобы чтобы ваши пользователи стали немного легче.

Для получения дополнительной информации о встраивании питона в вашу программу, прочитайте разделы propriate из документации:

Embedding Python in Another Application

Личные предложение: Использование Python 3.5, когда вы можете, и прекратить поддержку старые версии 2.x. Для получения дополнительной информации, прочитайте эту статью: Should I use Python 2 or Python 3 for my development activity?

+2

Почему именно '-1'? –

+0

Могу ли я сделать что-то вроде моего скрипта python, прежде всего, проверить, установлен ли модуль, а если нет, тогда установите C-модуль из самого скрипта python. Есть ли способ, которым это может быть достигнуто? – ironstein

+0

@ironstein вы можете «попробовать/исключить» импорт вашего модуля и предупредить пользователя об «ImportError», чтобы он/она должен установить ваш модуль. Вы можете даже разместить дополнительные инструкции в данном сообщении об ошибке (например, где его загрузить). –

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

  • Нет связанных вопросов^_^