Salt: pip install python 3 version of salt causes DecodeError

Created on 25 Oct 2017  路  5Comments  路  Source: saltstack/salt

Description of Issue/Question

I wanted to try some of the new python3 capable code, but it turns out installing the python3 salt libraries via pip causes some confusions for the salt script in /usr/bin/salt when salt is already installed via apt repos.

Setup

normal apt installation of salt-master and salt-minion version 2017.7.2

Steps to Reproduce Issue

doing this:

python3 -m pip install salt
salt '*' test.ping

causes this:

Traceback (most recent call last):
  File "/usr/local/bin/salt", line 11, in <module>
    sys.exit(salt_main())
  File "/usr/local/lib/python3.5/dist-packages/salt/scripts.py", line 476, in salt_main
    client.run()
  File "/usr/local/lib/python3.5/dist-packages/salt/cli/salt.py", line 173, in run
    for full_ret in cmd_func(**kwargs):
  File "/usr/local/lib/python3.5/dist-packages/salt/client/__init__.py", line 806, in cmd_cli
    **kwargs):
  File "/usr/local/lib/python3.5/dist-packages/salt/client/__init__.py", line 1586, in get_cli_event_returns
    **kwargs
  File "/usr/local/lib/python3.5/dist-packages/salt/client/__init__.py", line 1174, in get_iter_returns
    for raw in ret_iter:
  File "/usr/local/lib/python3.5/dist-packages/salt/client/__init__.py", line 1099, in get_returns_no_block
    no_block=True, auto_reconnect=self.auto_reconnect)
  File "/usr/local/lib/python3.5/dist-packages/salt/utils/event.py", line 632, in get_event
    ret = self._get_event(wait, tag, match_func, no_block)
  File "/usr/local/lib/python3.5/dist-packages/salt/utils/event.py", line 540, in _get_event
    raw = self.subscriber.read_sync(timeout=wait)
  File "/usr/local/lib/python3.5/dist-packages/salt/transport/ipc.py", line 705, in read_sync
    return ret_future.result()
  File "/usr/local/lib/python3.5/dist-packages/tornado/concurrent.py", line 238, in result
    raise_exc_info(self._exc_info)
  File "<string>", line 4, in raise_exc_info
  File "/usr/local/lib/python3.5/dist-packages/tornado/gen.py", line 1069, in run
    yielded = self.gen.send(value)
  File "/usr/local/lib/python3.5/dist-packages/salt/transport/ipc.py", line 681, in _read_sync
    raise exc_to_raise  # pylint: disable=E0702
  File "/usr/local/lib/python3.5/dist-packages/salt/transport/ipc.py", line 653, in _read_sync
    for framed_msg in self.unpacker:
  File "msgpack/_unpacker.pyx", line 469, in msgpack._unpacker.Unpacker.__next__ (msgpack/_unpacker.cpp:5459)
  File "msgpack/_unpacker.pyx", line 400, in msgpack._unpacker.Unpacker._unpack (msgpack/_unpacker.cpp:4483)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 22: invalid start byte

I guess pip replaces the salt script to try and run #!/usr/bin/python but I have not confirmed that.

reverting the problem

I got everything working again by doing the following:

python3 -m pip uninstall salt
apt-get install salt-master --reinstall
ln /usr/bin/salt /usr/local/bin/salt

It's not really a bug, but if people like me start to tinker and run in to trouble, they might find this helpful.

Versions Report

Salt Version:
           Salt: 2017.7.2

Dependency Versions:
           cffi: Not Installed
       cherrypy: 3.5.0
       dateutil: 2.4.2
      docker-py: Not Installed
          gitdb: 0.6.4
      gitpython: 1.0.1
          ioflo: Not Installed
         Jinja2: 2.8
        libgit2: Not Installed
        libnacl: Not Installed
       M2Crypto: Not Installed
           Mako: 1.0.3
   msgpack-pure: Not Installed
 msgpack-python: 0.4.6
   mysql-python: Not Installed
      pycparser: Not Installed
       pycrypto: 2.6.1
   pycryptodome: Not Installed
         pygit2: Not Installed
         Python: 2.7.12 (default, Nov 19 2016, 06:48:10)
   python-gnupg: Not Installed
         PyYAML: 3.11
          PyZMQ: 15.2.0
           RAET: Not Installed
          smmap: 0.9.0
        timelib: Not Installed
        Tornado: 4.2.1
            ZMQ: 4.1.4

System Versions:
           dist: Ubuntu 16.04 xenial
         locale: ANSI_X3.4-1968
        machine: x86_64
        release: 4.10.8-std-1
         system: Linux
        version: Ubuntu 16.04 xenial
info-needed

Most helpful comment

Same thing works if i use python2.7 instead of 3.5 in the virtualenv. Guess python3 is not supported, this should be updated in the documentation.

All 5 comments

Yeah, i would not think that this was supported, the apt package should be removed first, and then make sure that you don't have any .pyc files left behind, and then install with pip3.

Does that work?

Thanks,
Daniel

Yeah it does, I kind of wanted to have both at the same time, to run some of the python3 code via client api calls for a personal project, but it's not really so important, thank you :)

Installing salt in a virtualenv with pip using python 3 causes salt to throw the above error when the virtualenv is activated.

I need to write a python program that uses the salt client api and i don't know how to get around this issue. I need to use virtualenv, i cannot mess with system packages.

Is there any solution to use salt.LocalClient from python 3?

Same thing works if i use python2.7 instead of 3.5 in the virtualenv. Guess python3 is not supported, this should be updated in the documentation.

We would also like to use the Python3 version, any update on when this will be fixed?

Was this page helpful?
0 / 5 - 0 ratings