code: def encode_to_py3bytes_or_py2str(s):
      
  
      fallback_encoding = "utf8"
  
      if IS_PY3:
          # if we're already bytes, do nothing
          if isinstance(s, bytes):
              pass
          else:
              s = str(s)
              try:
                  s = bytes(s, DEFAULT_ENCODING)
              except UnicodeEncodeError:
                  s = bytes(s, fallback_encoding)
      else:
          # attempt to convert the thing to unicode from the system's encoding
          try:
              s = unicode(s, DEFAULT_ENCODING)
          # if the thing is already unicode, or it's a number, it can't be
          # coerced to unicode with an encoding argument, but if we leave out
          # the encoding argument, it will convert it to a string, then to unicode
          except TypeError:
              s = unicode(s)
  
          # now that we have guaranteed unicode, encode to our system encoding,
          # but attempt to fall back to something
          try:
              s = s.encode(DEFAULT_ENCODING)
          except:
              s = s.encode(fallback_encoding, "replace")
      return s
docs: takes anything and attempts to return a py2 string or py3 bytes.  this
      is typically used when creating command + arguments to be executed via
      os.exec*