Setuptools - Upload Error With Python 3.5

13 October 2016

Came across a funky error attempting to upload a package to PyPi using Python 3.5

$ python setup.py sdist bdist_wheel upload


...


Traceback (most recent call last):
  File "setup.py", line 45, in <module>
    install_requires=['django>=1.10']
  File "/usr/lib64/python3.5/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/usr/lib64/python3.5/distutils/dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "/usr/lib64/python3.5/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/usr/lib64/python3.5/distutils/command/upload.py", line 63, in run
    self.upload_file(command, pyversion, filename)
  File "/usr/lib64/python3.5/distutils/command/upload.py", line 162, in upload_file
    body.write(value)
TypeError: a bytes-like object is required, not 'str'

The setup.py file was along these lines

#!python
setup(
    name='project-name',
    ...
    platforms=['any'],
    license='MIT License',
    classifiers=(
        'Environment :: Web Environment',
        'Framework :: Django',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.5',
    ),
    packages=find_packages(),
    install_requires=['django>=1.10']
)

Took me a while to figure out what the issue was, and why the error, but alas is appears that the classifiers needs to be a list and not a tuple.

So changing the setup.py file to something like this

#!python
setup(
    name='project-name',
    ...
    platforms=['any'],
    license='MIT License',
    classifiers=[
        'Environment :: Web Environment',
        'Framework :: Django',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.5',
    ],
    packages=find_packages(),
    install_requires=['django>=1.10']
)

Fixed the issue.