Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google App Engine import libraries from parent folder

So my directory structure looks something like this:

\Project-Dir\
|- lib\
|  |- flask\
|  |- ...
|- module1_dir\
|  |- __init__.py
|  |- app.yaml
|  |- app.py
|  |- ...
|- module2_dir\
|  |- __init__.py
|  |- app.yaml
|  |- app.py
|  |- ...
|- ...

Inside app.py

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))

I have two modules inside the same root directory. They are both deployed to App Engine together. They also share the same libraries. The libraries are all pretty beefy so I'm trying to place them in a shared directory (lib).

I'm running dev_appserver.py from \Project-Dir\ and passing the two .yamls. My sys.path is set up fine to include the lib\ directory. And yet the sandbox seems to stubbornly insist that the libraries in lib\ just don't exist.

I'm sure I'm just missing something small like a config change somewhere. Or does App Engine really just flat-out not support such a setup?

EDIT: The imports work fine when I run it outside of dev_appserver.py.

like image 555
jsren Avatar asked Mar 23 '15 14:03

jsren


1 Answers

I spoke to a Google support engineer, after facing the same problem. Unfortunately, GAE does not support this kind of setup.

When you use the Modules API, module 1 and module 2 run inside separate Python virtual environments as separate self-contained instances. They cannot 'see' the contents of their parent directory. Modifying sys.path doesn't make a difference.

There are two solutions:

(a) Duplicate your 'lib' folder by placing it inside both 'module1_dir' and 'module2_dir'.

(b) Place the module files directly in the root directory.

like image 143
Milo Avatar answered Sep 28 '22 05:09

Milo