Расширение Python: предварительно загрузите мой модуль C

1

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

Можно ли загружать предварительную загрузку или предварительный импорт через C API, чтобы пользователь не набирал import <mymodule>? Или даже лучше, from <mymodule> import <function>?

Изменить: Я могу выполнить PyRun_SimpleString ( "из mymodule import myfunction" ) сразу после Py_Initialize(); - Мне просто интересно, есть ли другой способ сделать это.?

Изменить 2: Другими словами, у меня есть приложение, написанное на C, в которое встроен интерпретатор Python. Это приложение предоставляет некоторые функции, которые я хочу предоставить пользователям, чтобы они могли писать простые сценарии Python для приложения. Все, что я хочу, это удалить необходимость записи from mymodule import myfunction1, myfunction2, потому что, поскольку это очень специализированное приложение и script вообще не работают без приложения, не имеет смысла требовать от import ... все время.

  • 0
    Зачем вам это нужно? Просто почему?
  • 0
    «чтобы пользователю не приходилось печатать import <mymodule>»
Показать ещё 1 комментарий
Теги:
import
python-c-api
python-embedding

5 ответов

3

Даже если вы реализуете модуль в Python, пользователь должен будет import его. Так работает Python, и на самом деле это хорошо - это один из величайших плюсов Python - система пространства имен/модулей надежна, проста в использовании и понятна.

Только для академических упражнений вы, конечно, можете добавить свои новые функции к самому Python, создав собственный интерпретатор. Вы могли бы даже создать новые ключевые слова таким образом. Но для любой практической цели это не рекомендуется.

2

В общем, нет. Но если ваши пользователи будут использовать ваш модуль только в интерактивных сеансах, и вы можете установить свои переменные среды, вы можете установить переменную окружения PYTHONSTARTUP в script для запуска при запуске интерактивного сеанса.

Единственный случай, о котором я могу думать, - это то, что вы и ваша группа используете python для анализа данных, имеете пользовательские команды для вашей конкретной проблемы, и большинство пользователей больше ученых/статистиков, чем программистов. Но даже в этом случае я бы предложил использовать IPython, создав профиль IPython, а затем создав псевдоним / script для пользователей бежать. Это чище, а другое имя предупреждает их, что они не используют среду Python по умолчанию.

1

Если вы действительно этого хотите, установите переменную среды PYTHONSTARTUP, чтобы указать на файл. В sh, ksh, bash и т.д. Вы можете:

PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP

Затем вы можете поместить операторы и код в свой файл $PYTHONSTARTUP:

echo "import blah" >>$PYTHONSTARTUP

Это должно сделать это. Он будет работать только для интерактивных сеансов.

0

Отметьте это сообщение в блоге о том, как предварительно импортировать модули во встроенный питон.

Вставить модули Python и Import в C/С++

Например, чтобы симулировать следующий оператор в Python:

from hashlib import md5, sha1

В C:

PyObject * subModules = PyList_New(0);
PyList_Append(subModules, PyString_FromString("md5"));
PyList_Append(subModules, PyString_FromString("sha1"));
PyObject * hashlibImports = PyImport_ImportModuleEx("hashlib", NULL, NULL, subModules);
PyObject * md5Module = PyObject_GetAttr(hashlibImports, PyString_FromString("md5"));
PyObject * sha1Module = PyObject_GetAttr(hashlibImports, PyString_FromString("sha1"));
PyObject * mainModule = PyImport_AddModule("__main__");
PyModule_AddObject(mainModule, "md5", md5Module);
PyModule_AddObject(mainModule, "sha1", sha1Module);

Также приведена ссылка на соответствующий код из проекта, упомянутого в статье, который в основном выполняет:

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

после инициализации Python.

0

Неа. Вы можете добавить его к самому интерпретатору Python, но это будет означать создание пользовательской версии Python, которая, я думаю, не то, что вы хотите.

Этот import <mymodule> предназначен не только для загрузки модуля, но и для отображения этого модуля в пространстве имен (main | current). Будучи в состоянии сделать это, без взлома реального интерпретатора Python, будет работать с "Явным лучше, чем неявным" очень сильно.

  • 0
    Текущее пространство имен, вероятно, является диктатом, верно? Так что можно как-то найти этот dict и AddItem () мою функцию к нему ...?
  • 0
    @EricH - даже если это возможно каким-то хакерским способом, НЕ ДЕЛАЙТЕ ЭТОГО. Это не идиоматично в Python, не то, что пользователи ожидают, и вообще плохая практика.

Ещё вопросы

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