PyImport_Import does not fall back to default builtins
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
When importing a module with PyImport_Import() inside an already running python which does have limited globals, the import fails due to missing __builtins__: https://github.com/python/cpython/blob/01ba7df49966eaf14f44962a77898840c70dda96/Python/import.c#L3914-L3921
It feels similar to this issue: https://github.com/python/cpython/pull/24564 but with a slightly different setup.
Originally reported for pyo3 here: https://github.com/PyO3/pyo3/issues/4913
Minimal reproducer below, fuller reproducer can be found here: https://gitlab.com/nertpinx/cpython_repr
#include <Python.h>
PyObject *
func(PyObject *self __attribute__((unused)),
PyObject *arg)
{
return PyImport_Import(arg);
}
static PyMethodDef method_def = {
.ml_name = "func",
.ml_meth = func,
.ml_flags = METH_NOARGS,
.ml_doc = "Reproducer function",
};
int
main(int argc __attribute__((unused)),
char **argv __attribute__((unused)))
{
Py_InitializeEx(0);
PyObject *program = NULL;
PyObject *globals = NULL;
PyObject *supermodule = NULL;
PyObject *py_func = NULL;
supermodule = PyUnicode_FromString("supermodule");
py_func = PyCFunction_NewEx(&method_def, NULL, supermodule);
globals = PyDict_New();
PyDict_SetItemString(globals, "func", py_func);
program = Py_CompileString("func()", "<string>", Py_file_input);
PyEval_EvalCode(program, globals, NULL);
if (PyErr_Occurred()) {
PyErr_Print();
return 1;
}
return 0;
}
CPython versions tested on:
3.13
Operating systems tested on:
Linux
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par les lignes référencées de import.c autour de 3914-3921 et construisez le reproducer C minimal avec CPython 3.13. Vérifiez comment PyImport_Import gère les globals sans builtins, puis ajoutez un test de régression couvrant la configuration avec des globals limités. C’est terminé lorsque l’import réussit en utilisant les builtins par défaut au lieu d’échouer à cause de l’absence de builtins.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, python
- Domaine
- api, backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100