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
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.
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 .
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.
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With