Я пытаюсь расширить интерпретатор 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 ...
все время.
Даже если вы реализуете модуль в Python, пользователь должен будет import
его. Так работает Python, и на самом деле это хорошо - это один из величайших плюсов Python - система пространства имен/модулей надежна, проста в использовании и понятна.
Только для академических упражнений вы, конечно, можете добавить свои новые функции к самому Python, создав собственный интерпретатор. Вы могли бы даже создать новые ключевые слова таким образом. Но для любой практической цели это не рекомендуется.
В общем, нет. Но если ваши пользователи будут использовать ваш модуль только в интерактивных сеансах, и вы можете установить свои переменные среды, вы можете установить переменную окружения PYTHONSTARTUP в script для запуска при запуске интерактивного сеанса.
Единственный случай, о котором я могу думать, - это то, что вы и ваша группа используете python для анализа данных, имеете пользовательские команды для вашей конкретной проблемы, и большинство пользователей больше ученых/статистиков, чем программистов. Но даже в этом случае я бы предложил использовать IPython, создав профиль IPython, а затем создав псевдоним / script для пользователей бежать. Это чище, а другое имя предупреждает их, что они не используют среду Python по умолчанию.
Если вы действительно этого хотите, установите переменную среды PYTHONSTARTUP
, чтобы указать на файл. В sh
, ksh
, bash
и т.д. Вы можете:
PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP
Затем вы можете поместить операторы и код в свой файл $PYTHONSTARTUP
:
echo "import blah" >>$PYTHONSTARTUP
Это должно сделать это. Он будет работать только для интерактивных сеансов.
Отметьте это сообщение в блоге о том, как предварительно импортировать модули во встроенный питон.
Например, чтобы симулировать следующий оператор в 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.
Неа. Вы можете добавить его к самому интерпретатору Python, но это будет означать создание пользовательской версии Python, которая, я думаю, не то, что вы хотите.
Этот import <mymodule>
предназначен не только для загрузки модуля, но и для отображения этого модуля в пространстве имен (main | current). Будучи в состоянии сделать это, без взлома реального интерпретатора Python, будет работать с "Явным лучше, чем неявным" очень сильно.