Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does PyImport_Import fail to load a module from the current directory?

I'm trying to run the embedding example and I can't load a module from the current working directory unless I explicitly add it to sys.path then it works:

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\".\")"); 

Shouldn't Python look for modules in the current directory ?

Edit1: Tried just importing the module with:

Py_Initialize();
PyRun_SimpleString("import multiply"); 

And it still fails with the following error:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named multiply

Edit2: From the sys.path docs:

If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first.

Not sure what it means by not available, but if I print sys.path[0] it's not empty:

/usr/lib/pymodules/python2.7
like image 800
iabdalkader Avatar asked Nov 16 '12 19:11

iabdalkader


People also ask

Why can't Python find my module?

This is caused by the fact that the version of Python you're running your script with is not configured to search for modules where you've installed them. This happens when you use the wrong installation of pip to install packages.

How do you fix an import error?

Python's ImportError ( ModuleNotFoundError ) indicates that you tried to import a module that Python doesn't find. It can usually be eliminated by adding a file named __init__.py to the directory and then adding this directory to $PYTHONPATH .

What is import error in Python?

In Python, ImportError occurs when the Python program tries to import module which does not exist in the private table. This exception can be avoided using exception handling using try and except blocks. We also saw examples of how the ImportError occurs and how it is handled.


1 Answers

You need to call PySys_SetArgv(int argc, char **argv, int updatepath) for the relative imports to work. This will add the path of the script being executed to sys.path if updatepath is 0 (refer to the docs for more information).

The following should do the trick

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PySys_SetArgv(argc, argv); // must call this to get sys.argv and relative imports
  PyRun_SimpleString("import os, sys\n"
                     "print sys.argv, \"\\n\".join(sys.path)\n"
                     "print os.getcwd()\n"
                     "import thing\n" // import a relative module
                     "thing.printer()\n");
  Py_Finalize();
  return 0;
}
like image 187
Matti Lyra Avatar answered Sep 16 '22 13:09

Matti Lyra