Your second option is definitely the way to go. Break out common libraries and install them onto your local PyPi server.
Option 1 is horrendous because improvements to the libraries will be difficult to propagate to others who could use it.
Option 3 is similar to option 1.
The common pattern is to setup Jenkins so that when you push to master of a library repo, it does a python build and uploads it automatically to the PyPi repo. Once you write this build script, you'll never have to worry about packaging libraries and uploading them manually to PyPi. And with this option, all library updates will be instantly available to be possibly upgraded into other microservices.
Setting up your own PyPi server is very easy. I like this guide