[ovs-dev] [PATCH 02/55] python: Start fixing some Python 3 issues.

Russell Bryant russell at ovn.org
Mon Dec 21 20:47:02 UTC 2015


From: Terry Wilson <twilson at redhat.com>

This patch fixes just the Python 3 problems found by running:

  python3 setup.py install

There are still many other issues to be fixed, but this is a start.

Signed-off-by: Terry Wilson <twilson at redhat.com>
Signed-off-by: Russell Bryant <russell at ovn.org>
---
 python/ovs/daemon.py       | 31 ++++++++++++++++---------------
 python/ovs/db/idl.py       | 10 +++++-----
 python/ovs/fatal_signal.py |  2 +-
 python/ovs/json.py         |  2 +-
 python/ovs/ovsuuid.py      |  2 +-
 python/ovs/poller.py       |  2 +-
 python/ovs/socket_util.py  | 38 +++++++++++++++++++-------------------
 python/ovs/stream.py       | 12 +++++++-----
 python/setup.py            |  2 +-
 9 files changed, 52 insertions(+), 49 deletions(-)

diff --git a/python/ovs/daemon.py b/python/ovs/daemon.py
index 4a704c3..1e84dd2 100644
--- a/python/ovs/daemon.py
+++ b/python/ovs/daemon.py
@@ -133,30 +133,30 @@ def _make_pidfile():
         global file_handle
 
         file_handle = open(tmpfile, "w")
-    except IOError, e:
+    except IOError as e:
         _fatal("%s: create failed (%s)" % (tmpfile, e.strerror))
 
     try:
         s = os.fstat(file_handle.fileno())
-    except IOError, e:
+    except IOError as e:
         _fatal("%s: fstat failed (%s)" % (tmpfile, e.strerror))
 
     try:
         file_handle.write("%s\n" % pid)
         file_handle.flush()
-    except OSError, e:
+    except OSError as e:
         _fatal("%s: write failed: %s" % (tmpfile, e.strerror))
 
     try:
         fcntl.lockf(file_handle, fcntl.LOCK_EX | fcntl.LOCK_NB)
-    except IOError, e:
+    except IOError as e:
         _fatal("%s: fcntl failed: %s" % (tmpfile, e.strerror))
 
     # Rename or link it to the correct name.
     if _overwrite_pidfile:
         try:
             os.rename(tmpfile, _pidfile)
-        except OSError, e:
+        except OSError as e:
             _fatal("failed to rename \"%s\" to \"%s\" (%s)"
                    % (tmpfile, _pidfile, e.strerror))
     else:
@@ -164,7 +164,7 @@ def _make_pidfile():
             try:
                 os.link(tmpfile, _pidfile)
                 error = 0
-            except OSError, e:
+            except OSError as e:
                 error = e.errno
             if error == errno.EEXIST:
                 _check_already_running()
@@ -200,7 +200,7 @@ def _waitpid(pid, options):
     while True:
         try:
             return os.waitpid(pid, options)
-        except OSError, e:
+        except OSError as e:
             if e.errno == errno.EINTR:
                 pass
             return -e.errno, 0
@@ -209,13 +209,13 @@ def _waitpid(pid, options):
 def _fork_and_wait_for_startup():
     try:
         rfd, wfd = os.pipe()
-    except OSError, e:
+    except OSError as e:
         sys.stderr.write("pipe failed: %s\n" % os.strerror(e.errno))
         sys.exit(1)
 
     try:
         pid = os.fork()
-    except OSError, e:
+    except OSError as e:
         sys.stderr.write("could not fork: %s\n" % os.strerror(e.errno))
         sys.exit(1)
 
@@ -227,7 +227,7 @@ def _fork_and_wait_for_startup():
             try:
                 s = os.read(rfd, 1)
                 error = 0
-            except OSError, e:
+            except OSError as e:
                 s = ""
                 error = e.errno
             if error != errno.EINTR:
@@ -315,7 +315,8 @@ def _monitor_daemon(daemon_pid):
                         wakeup = last_restart + 10000
                         if now > wakeup:
                             break
-                        print "sleep %f" % ((wakeup - now) / 1000.0)
+                        sys.stdout.write("sleep %f\n" % (
+                            (wakeup - now) / 1000.0))
                         time.sleep((wakeup - now) / 1000.0)
                 last_restart = ovs.timeval.msec()
 
@@ -406,7 +407,7 @@ def __read_pidfile(pidfile, delete_if_stale):
 
     try:
         file_handle = open(pidfile, "r+")
-    except IOError, e:
+    except IOError as e:
         if e.errno == errno.ENOENT and delete_if_stale:
             return 0
         vlog.warn("%s: open: %s" % (pidfile, e.strerror))
@@ -439,7 +440,7 @@ def __read_pidfile(pidfile, delete_if_stale):
         # We won the right to delete the stale pidfile.
         try:
             os.unlink(pidfile)
-        except IOError, e:
+        except IOError as e:
             vlog.warn("%s: failed to delete stale pidfile (%s)"
                             % (pidfile, e.strerror))
             return -e.errno
@@ -447,7 +448,7 @@ def __read_pidfile(pidfile, delete_if_stale):
             vlog.dbg("%s: deleted stale pidfile" % pidfile)
             file_handle.close()
             return 0
-    except IOError, e:
+    except IOError as e:
         if e.errno not in [errno.EACCES, errno.EAGAIN]:
             vlog.warn("%s: fcntl: %s" % (pidfile, e.strerror))
             return -e.errno
@@ -456,7 +457,7 @@ def __read_pidfile(pidfile, delete_if_stale):
     try:
         try:
             error = int(file_handle.readline())
-        except IOError, e:
+        except IOError as e:
             vlog.warn("%s: read: %s" % (pidfile, e.strerror))
             error = -e.errno
         except ValueError:
diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
index c8990c7..5e3466e 100644
--- a/python/ovs/db/idl.py
+++ b/python/ovs/db/idl.py
@@ -191,7 +191,7 @@ class Idl(object):
                     self._monitor_request_id = None
                     self.__clear()
                     self.__parse_update(msg.result)
-                except error.Error, e:
+                except error.Error as e:
                     vlog.err("%s: parse error in received schema: %s"
                               % (self._session.get_name(), e))
                     self.__error()
@@ -354,7 +354,7 @@ class Idl(object):
     def __parse_update(self, update):
         try:
             self.__do_parse_update(update)
-        except error.Error, e:
+        except error.Error as e:
             vlog.err("%s: error parsing update: %s"
                      % (self._session.get_name(), e))
 
@@ -451,7 +451,7 @@ class Idl(object):
 
             try:
                 datum = ovs.db.data.Datum.from_json(column.type, datum_json)
-            except error.Error, e:
+            except error.Error as e:
                 # XXX rate-limit
                 vlog.warn("error parsing column %s in table %s: %s"
                           % (column_name, table.name, e))
@@ -599,7 +599,7 @@ class Row(object):
         try:
             datum = ovs.db.data.Datum.from_python(column.type, value,
                                                   _row_to_uuid)
-        except error.Error, e:
+        except error.Error as e:
             # XXX rate-limit
             vlog.err("attempting to write bad value to column %s (%s)"
                      % (column_name, e))
@@ -618,7 +618,7 @@ class Row(object):
                 continue
             try:
                 datum = ovs.db.data.Datum.from_json(column.type, datum_json)
-            except error.Error, e:
+            except error.Error as e:
                 # XXX rate-limit
                 vlog.warn("error parsing column %s in table %s: %s"
                           % (column_name, table.name, e))
diff --git a/python/ovs/fatal_signal.py b/python/ovs/fatal_signal.py
index e6fe783..7308039 100644
--- a/python/ovs/fatal_signal.py
+++ b/python/ovs/fatal_signal.py
@@ -90,7 +90,7 @@ def _unlink(file_):
     try:
         os.unlink(file_)
         return 0
-    except OSError, e:
+    except OSError as e:
         return e.errno
 
 
diff --git a/python/ovs/json.py b/python/ovs/json.py
index d329ee4..bfa9f5a 100644
--- a/python/ovs/json.py
+++ b/python/ovs/json.py
@@ -143,7 +143,7 @@ def from_file(name):
 def from_string(s):
     try:
         s = unicode(s, 'utf-8')
-    except UnicodeDecodeError, e:
+    except UnicodeDecodeError as e:
         seq = ' '.join(["0x%2x" % ord(c)
                         for c in e.object[e.start:e.end] if ord(c) >= 0x80])
         return ("not a valid UTF-8 string: invalid UTF-8 sequence %s" % seq)
diff --git a/python/ovs/ovsuuid.py b/python/ovs/ovsuuid.py
index 56fdad0..5cc0e1d 100644
--- a/python/ovs/ovsuuid.py
+++ b/python/ovs/ovsuuid.py
@@ -42,7 +42,7 @@ def from_json(json, symtab=None):
         if not uuidRE.match(s):
             raise error.Error("\"%s\" is not a valid UUID" % s, json)
         return uuid.UUID(s)
-    except error.Error, e:
+    except error.Error as e:
         if not symtab:
             raise e
         try:
diff --git a/python/ovs/poller.py b/python/ovs/poller.py
index b67cfc5..d07033b 100644
--- a/python/ovs/poller.py
+++ b/python/ovs/poller.py
@@ -167,7 +167,7 @@ class Poller(object):
             try:
                 events = self.poll.poll(self.timeout)
                 self.__log_wakeup(events)
-            except select.error, e:
+            except select.error as e:
                 # XXX rate-limit
                 error, msg = e
                 if error != errno.EINTR:
diff --git a/python/ovs/socket_util.py b/python/ovs/socket_util.py
index f657d11..3bd4750 100644
--- a/python/ovs/socket_util.py
+++ b/python/ovs/socket_util.py
@@ -40,7 +40,7 @@ def make_short_name(long_name):
             os.symlink(long_dirname, link_name)
             ovs.fatal_signal.add_file_to_unlink(link_name)
             return os.path.join(link_name, os.path.basename(long_name))
-        except OSError, e:
+        except OSError as e:
             if e.errno != errno.EEXIST:
                 break
     raise Exception("Failed to create temporary symlink")
@@ -65,7 +65,7 @@ def make_unix_socket(style, nonblock, bind_path, connect_path, short=False):
 
     try:
         sock = socket.socket(socket.AF_UNIX, style)
-    except socket.error, e:
+    except socket.error as e:
         return get_exception_errno(e), None
 
     try:
@@ -75,7 +75,7 @@ def make_unix_socket(style, nonblock, bind_path, connect_path, short=False):
             # Delete bind_path but ignore ENOENT.
             try:
                 os.unlink(bind_path)
-            except OSError, e:
+            except OSError as e:
                 if e.errno != errno.ENOENT:
                     return e.errno, None
 
@@ -84,19 +84,19 @@ def make_unix_socket(style, nonblock, bind_path, connect_path, short=False):
 
             try:
                 if sys.hexversion >= 0x02060000:
-                    os.fchmod(sock.fileno(), 0700)
+                    os.fchmod(sock.fileno(), 0o700)
                 else:
-                    os.chmod("/dev/fd/%d" % sock.fileno(), 0700)
-            except OSError, e:
+                    os.chmod("/dev/fd/%d" % sock.fileno(), 0o700)
+            except OSError as e:
                 pass
         if connect_path is not None:
             try:
                 sock.connect(connect_path)
-            except socket.error, e:
+            except socket.error as e:
                 if get_exception_errno(e) != errno.EINPROGRESS:
                     raise
         return 0, sock
-    except socket.error, e:
+    except socket.error as e:
         sock.close()
         if (bind_path is not None and
             os.path.exists(bind_path)):
@@ -114,7 +114,7 @@ def make_unix_socket(style, nonblock, bind_path, connect_path, short=False):
                 basename = os.path.basename(connect_path)
                 try:
                     connect_dirfd = os.open(dirname, os.O_DIRECTORY | os.O_RDONLY)
-                except OSError, err:
+                except OSError as err:
                     return get_exception_errno(err), None
                 short_connect_path = "/proc/self/fd/%d/%s" % (connect_dirfd, basename)
 
@@ -123,7 +123,7 @@ def make_unix_socket(style, nonblock, bind_path, connect_path, short=False):
                 basename = os.path.basename(bind_path)
                 try:
                     bind_dirfd = os.open(dirname, os.O_DIRECTORY | os.O_RDONLY)
-                except OSError, err:
+                except OSError as err:
                     return get_exception_errno(err), None
                 short_bind_path = "/proc/self/fd/%d/%s" % (bind_dirfd, basename)
 
@@ -169,7 +169,7 @@ def check_connection_completion(sock):
                 # XXX rate-limit
                 vlog.err("poll return POLLERR but send succeeded")
                 return errno.EPROTO
-            except socket.error, e:
+            except socket.error as e:
                 return get_exception_errno(e)
         else:
             return 0
@@ -217,7 +217,7 @@ def inet_open_active(style, target, default_port, dscp):
         else:
             sock = socket.socket(socket.AF_INET6, style, 0)
             family = socket.AF_INET6
-    except socket.error, e:
+    except socket.error as e:
         return get_exception_errno(e), None
 
     try:
@@ -225,11 +225,11 @@ def inet_open_active(style, target, default_port, dscp):
         set_dscp(sock, family, dscp)
         try:
             sock.connect(address)
-        except socket.error, e:
+        except socket.error as e:
             if get_exception_errno(e) != errno.EINPROGRESS:
                 raise
         return 0, sock
-    except socket.error, e:
+    except socket.error as e:
         sock.close()
         return get_exception_errno(e), None
 
@@ -256,7 +256,7 @@ def get_null_fd():
     if null_fd < 0:
         try:
             null_fd = os.open("/dev/null", os.O_RDWR)
-        except OSError, e:
+        except OSError as e:
             vlog.err("could not open /dev/null: %s" % os.strerror(e.errno))
             return -e.errno
     return null_fd
@@ -282,14 +282,14 @@ def write_fully(fd, buf):
             else:
                 bytes_written += retval
                 buf = buf[:retval]
-        except OSError, e:
+        except OSError as e:
             return e.errno, bytes_written
 
 
 def set_nonblocking(sock):
     try:
         sock.setblocking(0)
-    except socket.error, e:
+    except socket.error as e:
         vlog.err("could not set nonblocking mode on socket: %s"
                  % os.strerror(get_exception_errno(e)))
 
@@ -302,12 +302,12 @@ def set_dscp(sock, family, dscp):
     if family == socket.AF_INET:
         try:
             sock.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, val)
-        except socket.error, e:
+        except socket.error as e:
             raise
     elif family == socket.AF_INET6:
         try:
             sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_TCLASS, val)
-        except socket.error, e:
+        except socket.error as e:
             raise
     else:
         raise
diff --git a/python/ovs/stream.py b/python/ovs/stream.py
index fb083ee..1af9253 100644
--- a/python/ovs/stream.py
+++ b/python/ovs/stream.py
@@ -121,7 +121,7 @@ class Stream(object):
         raise NotImplementedError("This method must be overrided by subclass")
 
     @staticmethod
-    def open_block((error, stream)):
+    def open_block(error_stream):
         """Blocks until a Stream completes its connection attempt, either
         succeeding or failing.  (error, stream) should be the tuple returned by
         Stream.open().  Returns a tuple of the same form.
@@ -129,6 +129,8 @@ class Stream(object):
         Typical usage:
         error, stream = Stream.open_block(Stream.open("unix:/tmp/socket"))"""
 
+        # Py3 doesn't support tuple parameter unpacking - PEP 3113
+        error, stream = error_stream
         if not error:
             while True:
                 error = stream.connect()
@@ -198,7 +200,7 @@ class Stream(object):
 
         try:
             return (0, self.socket.recv(n))
-        except socket.error, e:
+        except socket.error as e:
             return (ovs.socket_util.get_exception_errno(e), "")
 
     def send(self, buf):
@@ -220,7 +222,7 @@ class Stream(object):
 
         try:
             return self.socket.send(buf)
-        except socket.error, e:
+        except socket.error as e:
             return -ovs.socket_util.get_exception_errno(e)
 
     def run(self):
@@ -293,7 +295,7 @@ class PassiveStream(object):
 
         try:
             sock.listen(10)
-        except socket.error, e:
+        except socket.error as e:
             vlog.err("%s: listen: %s" % (name, os.strerror(e.error)))
             sock.close()
             return e.error, None
@@ -321,7 +323,7 @@ class PassiveStream(object):
                 sock, addr = self.socket.accept()
                 ovs.socket_util.set_nonblocking(sock)
                 return 0, Stream(sock, "unix:%s" % addr, 0)
-            except socket.error, e:
+            except socket.error as e:
                 error = ovs.socket_util.get_exception_errno(e)
                 if error != errno.EAGAIN:
                     # XXX rate-limit
diff --git a/python/setup.py b/python/setup.py
index 889d215..62507ad 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -19,7 +19,7 @@ VERSION = "unknown"
 
 try:
     # Try to set the version from the generated ovs/version.py
-    execfile("ovs/version.py")
+    exec(open("ovs/version.py").read())
 except IOError:
     print("Ensure version.py is created by running make python/ovs/version.py",
           file=sys.stderr)
-- 
2.5.0




More information about the dev mailing list