So i am having a weird run issue.
snap run flexx-interface
doesn’t work - the error:
Traceback (most recent call last):
File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/snap/my-interface/x74/src/Main_Client.py", line 20, in <module>
from interfaces import Interface
File "/snap/my-interface/x74/src/interfaces.py", line 1, in <module>
import telnetlib3
ModuleNotFoundError: No module named 'telnetlib3'
Seems obvious. However:
- this python lib is installed (used snapcraft debug to confirm it’s installed on host and in snap ),
- there is only python3 and python3.10 installed on the machine and snap - no other versions. I can use both to import telnetlib3 successfully.
- When I run my-interface (the command launch file) directly the snap runs. So in the command line if I run ./my-interface it will have no issues.
Part of my snapcraft.yaml:
apps:
my-interface:
command: my-interface
environment:
PYTHONPATH: $SNAP/usr/lib/python3/site-packages:$SNAP/usr/lib/python3/dist-packages:
LD_LIBRARY_PATH:....
The my-interfaces file:
#!/usr/bin/env python3
import subprocess
subprocess.call("./my-interface.sh", cwd="src")
Any ideas why snap run is not working? I thought it may be using some wrong, hidden python version, but from what I can tell, all python versions have telnetlib3 installed.
Try setting these three env variables in your snapcraft definition:
PYTHONHOME: $SNAP/usr
PYTHON_SITE_PACKAGES_PATH: $SNAP/lib/python3.10/site-packages
PYTHONPATH: $PYTHONPATH:$PYTHON_SITE_PACKAGES_PATH
if push comes to shove add the below stage packages and remove what you don’t need:
- libpython3-stdlib
- libpython3.10-stdlib
- libpython3.10-minimal
- python3-pip
- python3-setuptools
- python3-wheel
- python3-venv
- python3-minimal
- python3-distutils
- python3-pkg-resources
- python3.10-minimal
https://snapcraft.io/docs/python-plugin also shows how you can include pip packages required for your snap if you do not have a setup.py
and requirements.txt
in your python module.
If I add the three env vars above, I get
Python path configuration:
PYTHONHOME = '/snap/my-interface/x80/usr'
PYTHONPATH = ':/snap/my-interface/x80/lib/python3.10/site-packages'
program name = 'python3'
isolated = 0
environment = 1
user site = 1
import site = 1
sys._base_executable = '/usr/bin/python3'
sys.base_prefix = '/snap/my-interface/x80/usr'
sys.base_exec_prefix = '/snap/my-interface/x80/usr'
sys.platlibdir = 'lib'
sys.executable = '/usr/bin/python3'
sys.prefix = '/snap/my-interface/x80/usr'
sys.exec_prefix = '/snap/my-interface/x80/usr'
sys.path = [
'',
'/snap/my-interface/x80/lib/python3.10/site-packages',
'/snap/my-interface/x80/usr/lib/python310.zip',
'/snap/my-interface/x80/usr/lib/python3.10',
'/snap/my-interface/x80/usr/lib/python3.10/lib-dynload',
]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00007f2bd4303000 (most recent call first):
<no Python frame>
Ok, so narrowed down the problem.
When I run --debug flag, the packages seem to be there. However when I look at
/snap/my-interface/current/usr/lib/python3.10 they are not. I have tried installing these packages, both in stage-packages as well as in override-stage and in prime. They are in /snap-my-interface/usr/lib/python3/dist-packages.
In debug mode, I see it’s installed to python3 dist-packages, but not python3.10, which is what it’s using to run. Running with python3 also returns the package not found error.
Share your complete yaml please.