2009-07-17 1 views
4

Я пытаюсь внедрить интерпретатор Python и должен настроить способ загрузки стандартной библиотеки Python. Наша библиотека будет загружена из того же каталога, что и исполняемый файл, а не из префикса/lib /.Как переопределить Py_GetPrefix(), Py_GetPath()?

Мы успешно выполнили эту работу, вручную изменив sys.path после вызова Py_Initialize(), однако это порождает предупреждение, поскольку Py_Initialize ищет site.py в ./lib/, и его нет до тех пор, пока после Вызывается Py_Initialize, и мы обновили sys.path.

Python c-api docs Подсказка что можно переопределить Py_GetPrefix() и Py_GetPath(), но не указывать, как. Кто-нибудь знает, как я буду их переопределять?

ответ

4

Вы можете установить Py_NoSiteFlag = 1, позвоните по номеру PyInitialize и импортируйте для вас нужные сайты.

+0

Это именно то, что мне нужно, спасибо! –

3

Вы решили использовать putenv для настройки PYTHONPATH перед вызовом Py_Initialize?

3

Я вижу, что это было задано давно, но я только что столкнулся с той же проблемой. Py_NoSiteFlag поможет с модулем сайта, но, как правило, лучше переписать Modules/getpath.c; Python docs officially recommend это для «приложения [a] n, требующего полного контроля». Python импортирует некоторые модули во время инициализации (тот, который ударил меня, был encodings), поэтому, если вы не хотите их или не встроили в них , путь поиска модуля должен быть готов до вы вызываете Py_Initialize().

Из того, что я понимаю Py_GetPath просто возвращает путь поиска модуля; Py_GetProgramFullPath является самоописанием; и Py_GetPrefix и Py_GetExecPrefix не используются кем-либо, кроме некоторых таинственных «ILU».

0

Следующие функции могут быть вызваны перед вызовом Py_Initialize():

  • Py_SetProgramName()
  • Py_SetPythonHome()
  • Py_SetPath()

Все это влияет на то, как Python находит модули. Я рекомендую прочитать documentation об этих функциях и поиграть с ними.

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