On 2018-07-28 22:16, stefand...@gmail.com wrote:
Hi everyone,
I am currently investigating an interesting bug in homeassistant which is a bit 
hard to reproduce. I already dug so deep that I ask here, because I think the 
root cause has to do with how Python locates and loads modules/packages.

The "story" is: In homeassistant (short HA) some modules are installed at runtime during 
first start ("bootstrapping"), and for some reason loading the modules fails directly 
after installing the modules. Subsequent starts work fine.

The modules that are installed during bootstrapping are installed to 
`~/.homeassistant/deps/lib/python3.7/site-packages`. Installing the modules 
happens in a different thread than where the modules are imported. (However as 
far as I can tell the importing thread waits for the install to finish.)

Now the interesting thing is that when I start HA in verbose mode, I can see 
that Python is trying not all of the paths that are in `sys.path` (in the 
following snippet I cut out some stuff for brevity. Link to the full log at the 
end). As one can see the `~/.homeassistant/deps/lib/python3.7/site-packages` 
location is not tried and hence the import fails:

   ```
   # trying 
/home/pyuser/.homeassistant/sqlalchemy.cpython-37m-x86_64-linux-gnu.so
   # trying /home/pyuser/.homeassistant/sqlalchemy.abi3.so
   # trying /home/pyuser/.homeassistant/sqlalchemy.so
   # trying /home/pyuser/.homeassistant/sqlalchemy.py
   # trying /home/pyuser/.homeassistant/sqlalchemy.pyc
   # trying /home/pyuser/sqlalchemy.cpython-37m-x86_64-linux-gnu.so
   [...]
   # trying /usr/local/lib/python3.7/sqlalchemy.cpython-37m-x86_64-linux-gnu.so
   [...]
   # trying 
/usr/local/lib/python3.7/lib-dynload/sqlalchemy.cpython-37m-x86_64-linux-gnu.so
   [...]
   # trying 
/home/pyuser/.local/lib/python3.7/site-packages/sqlalchemy.cpython-37m-x86_64-linux-gnu.so
   [...]
   # trying 
/usr/local/lib/python3.7/site-packages/sqlalchemy.cpython-37m-x86_64-linux-gnu.so
   [...]
   Exception in thread Recorder:
   Traceback (most recent call last):
     File "/usr/local/lib/python3.7/threading.py", line 917, in _bootstrap_inner
       self.run()
     File 
"/home/pyuser/.local/lib/python3.7/site-packages/homeassistant/components/recorder/__init__.py",
 line 187, in run
       from .models import States, Events
     File "<frozen importlib._bootstrap>", line 983, in _find_and_load
     File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
     File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
     File "<frozen importlib._bootstrap_external>", line 728, in exec_module
     File "<frozen importlib._bootstrap>", line 219, in 
_call_with_frames_removed
     File 
"/home/pyuser/.local/lib/python3.7/site-packages/homeassistant/components/recorder/models.py",
 line 8, in <module>
       from sqlalchemy import (
     File "<frozen importlib._bootstrap>", line 983, in _find_and_load
     File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
   ModuleNotFoundError: No module named 'sqlalchemy'
   ```

I also checked that this path is also really in `sys.path` at the time the 
import happens. This is `sys.path` printed out directly before the `import 
sqlalchemy statement`:

   ```
   ['/home/pyuser/.homeassistant',
    '/home/pyuser/.homeassistant/deps/lib/python3.7/site-packages',
    '/home/pyuser',
    '/usr/local/lib/python37.zip',
    '/usr/local/lib/python3.7',
    '/usr/local/lib/python3.7/lib-dynload',
    '/home/pyuser/.local/lib/python3.7/site-packages',
    '/usr/local/lib/python3.7/site-packages']
   ```


What I already tried is to do a importlib.invalidate_caches() after installing 
the modules. However this does not fix it.

So what is happening here? Why does the import skip 
`~/.homeassistant/deps/lib/python3.7/site-packages`? Any tips on how I can 
investigate further?

Link to the full log: 
https://gist.github.com/StefanD986/fbf08426ceaad657929b973cd5add25a#file-homeassistant_verbose_first_start-txt-L5787

The log contains entries that say "Please check your config". To me it looks like it hasn't been installed.

Does the path /home/pyuser/.homeassistant/deps/lib/python3.7/site-packages actually exist?
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to