mariner
mariner copied to clipboard
ModuleNotFoundError: No module named 'encodings'
Description Mariner can't be started on DietPi
Reproduction Steps Steps to reproduce the behavior:
- Install DietPi on SD card, boot and do minimal setup to get a running system.
- Follow setup instructions to install mariner package from PPA
- (optional) Install
dbus
to make systemd behave properly
Expected Behavior
Mariner starts, preferably from the systemd unit, but manual start via sudo -u mariner mariner
is acceptable.
Screenshots / Logs
dietpi@marsbox:~$ sudo -u mariner mariner
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
Current thread 0xb6fc6a00 (most recent call first):
Aborted
Details:
- Mariner Version: 0.2.0-1
- Printer Model: Elegoo Mars
- Raspberry Pi Model: RPi Zero W
Additional context Add any other context about the problem here.
I guess this is the problem:
dietpi@marsbox:~$ ls -l /opt/venvs/mariner3d/lib/python3.7/encodings
lrwxrwxrwx 1 root root 28 Apr 17 2021 /opt/venvs/mariner3d/lib/python3.7/encodings -> /usr/lib/python3.7/encodings
But DietPi (based on Rasbian/Debian 11) has Python 3.9, so the correct target for the symlink would be /usr/lib/python3.9/encodings
.
Trying the stupid thing and symlinking /usr/lib/python3.7
to /usr/lib/python3.9
helps with a couple of errors, but not enough to get it to work.
I think the big issue is that you're using a packaged venv that makes incorrect assumptions about the environment it gets installed to. Maybe it would be better do do a pip3 install .
from sources, when the package gets installed? That would at least ensure the correct environment is used.
@jangrewe
I fixed it by copying python 3.9 to the mariner directory, copying some files from python3.7 to python3.9 directory, and editing/relaunching the post-install script. It's faster than compiling required Python on Zero.
Symlink Python 3.7 to the Python 3.9
cd /opt/venvs/mariner3d/bin
sudo ln -s python3.7 /usr/bin/python3.9
Copy Python 3.9 libs to the mariner:
sudo cp -r /usr/lib/python3.9 /opt/venvs/mariner3d/lib/python3.9
Go to the mariner directory and copy some files/dirs from the Python 3.7 to the Python 3.9 directory:
cd /opt/venvs/mariner3d/lib/python3.7
sudo cp no-global-site-packages.txt ../python3.9/no-global-site-packages.txt
sudo cp orig-prefix.txt ../python3.9/orig-prefix.txt
sudo cp site.py ../python3.9/site.py
sudo cp -r site-packages/ ../python3.9/site-packages/
Edit postinstall script adding Python 3.9 version - find the next string and add Python 3.9 version:
sudo nano /var/lib/dpkg/info/mariner3d.postinst
local pythonX_Y=$(cd "$dh_venv_install_dir/lib" && ls -1d python3.9 | tail -n1)
Run postinstall script:
sudo /var/lib/dpkg/info/mariner3d.postinst configure
Now web interface is running but there are another error "Unexpected Printer Response" (I don't have a connected printer yet, so not sure if this error cannot be due to this fact)
Traceback (most recent call last):
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/mariner/server/api.py", line 46, in print_status
selected_file = elegoo_mars.get_selected_file()
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/mariner/mars.py", line 102, in get_selected_file
self._extract_response_with_regex("ok '([^']+)'\r\n", data).group(1)
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/mariner/mars.py", line 39, in _extract_response_with_regex
raise UnexpectedPrinterResponse(data)
mariner.exceptions.UnexpectedPrinterResponse
Thanks @dmpanch, i've now rebuilt everything against Python 3.9 and got it to work, at least theoretically. Your approach is probably a lot faster, so i'll give that a shot for the next time.
But i guess it would be nicer if the package would be built for the current Python version, i guess.
Anyways, now i'm running into a problem similar to yours (which doesn't look like it's python related, though): The printer returned an unexpected response: 'ok N:20\r\n'
Traceback (most recent call last):
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/flask/app.py", line 1513, in full_dispatch_request
rv = self.dispatch_request()
File "/opt/venvs/mariner3d/lib/python3.9/site-packages/flask/app.py", line 1499, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/opt/mariner/mariner/server/api.py", line 54, in print_status
selected_file = retry(
File "/opt/mariner/mariner/server/utils.py", line 54, in retry
return func()
File "/opt/mariner/mariner/printer.py", line 103, in get_selected_file
self._extract_response_with_regex("ok '([^']+)'\r\n", data).group(1)
File "/opt/mariner/mariner/printer.py", line 40, in _extract_response_with_regex
raise UnexpectedPrinterResponse(data)
mariner.exceptions.UnexpectedPrinterResponse: ok N:20
That looks like mariner doesn't understand what printer's status output? edit: okay, found this: https://github.com/luizribeiro/mariner/issues/180
@jangrewe totally agree with you about the Python version. Btw, today I found PPA with the different Python versions, it would have been useful a few days ago.
Thank you dmpanch, you saved my day.
There is only one slight mistake in your ln command, the parameters need to be swapped; the correct command is
sudo ln -s /usr/bin/python3.9 python3.7
Problem solved, check here #493 for install python 3.7.4
I got around this by starting with a legacy raspbian image. The Debian Buster based image released Dec 2nd 2021 comes with python 3.7 instead of 3.9, and Mariner installs & runs with no issues.
‼️https://github.com/luizribeiro/mariner/issues/481#issuecomment-968325624 is harmful because you are basically mixing two versions of python hoping for the best, maybe it worked, fine, but you may have screwed the installation of any other softwares relying on Python 3.9 you may want to install later.
I'm in the process of writing a comprehensive issue with a sane solution included, maybe using pyenv.