From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Jeremy Cline <jeremy@jcline.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] tools/kvm_stat: Add Python 3 support to kvm_stat
Date: Thu, 5 Oct 2017 20:05:27 +0200 [thread overview]
Message-ID: <20171005180526.GA5656@flask> (raw)
In-Reply-To: <0100015ee55adf8e-6cbbee98-de48-467f-baf8-e0dc1ebdd1f8-000000@email.amazonses.com>
2017-10-04 03:08+0000, Jeremy Cline:
> Make kvm_stat support Python 3 by changing the use of "print" to a
> function rather than a statement, switching from "iteritems" and
> "iterkeys" (removed in Python 3) to "items" and "keys" respectively,
> and decoding bytes to strings when dealing with text.
>
> With this change, kvm_stat is usable with Python 2.6 and greater.
>
> Signed-off-by: Jeremy Cline <jeremy@jcline.org>
> ---
> There were a few flaws in my original patch that changed the behavior in
> Python 2. Additionally, I missed several compatibility problems with
> Python 3. Sorry!
No problem, you even sent a new version before I got to test it. :)
Queued for 4.15, thanks.
> Changes in v2:
> - Include the "end=' '" argument in print statements that previously
> had trailing commas since in Python 2 that causes the print
> statement to not print a newline.
> - decode bytes strings to text strings so that string concatenation
> works properly in Python 3.
> - replace "iterkeys" with "keys" as "iterkeys" is not in Python 3.
>
> tools/kvm/kvm_stat/kvm_stat | 30 +++++++++++++++++-------------
> 1 file changed, 17 insertions(+), 13 deletions(-)
>
> diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
> index 32283d88701a..217cf6f95c36 100755
> --- a/tools/kvm/kvm_stat/kvm_stat
> +++ b/tools/kvm/kvm_stat/kvm_stat
> @@ -19,9 +19,11 @@ Three different ways of output formatting are available:
>
> The data is sampled from the KVM's debugfs entries and its perf events.
> """
> +from __future__ import print_function
>
> import curses
> import sys
> +import locale
> import os
> import time
> import optparse
> @@ -225,6 +227,8 @@ IOCTL_NUMBERS = {
> 'RESET': 0x00002403,
> }
>
> +ENCODING = locale.getpreferredencoding(False)
> +
>
> class Arch(object):
> """Encapsulates global architecture specific data.
> @@ -666,7 +670,7 @@ class TracepointProvider(Provider):
> """Returns 'event name: current value' for all enabled events."""
> ret = defaultdict(int)
> for group in self.group_leaders:
> - for name, val in group.read().iteritems():
> + for name, val in group.read().items():
> if name in self._fields:
> ret[name] += val
> return ret
> @@ -955,7 +959,7 @@ class Tui(object):
> except:
> raise Exception
> for line in child.stdout:
> - line = line.lstrip().split(' ', 1)
> + line = line.decode(ENCODING).lstrip().split(' ', 1)
> # perform a sanity check before calling the more expensive
> # function to possibly extract the guest name
> if ' -name ' in line[1]:
> @@ -1005,7 +1009,7 @@ class Tui(object):
> name = ''
> try:
> line = open('/proc/{}/cmdline'
> - .format(pid), 'rb').read().split('\0')
> + .format(pid), 'r').read().split('\0')
> parms = line[line.index('-name') + 1].split(',')
> while '' in parms:
> # commas are escaped (i.e. ',,'), hence e.g. 'foo,bar' results
> @@ -1170,7 +1174,7 @@ class Tui(object):
> .format(self.stats.fields_filter))
> self.screen.addstr(3, 0, "New regex: ")
> curses.echo()
> - regex = self.screen.getstr()
> + regex = self.screen.getstr().decode(ENCODING)
> curses.noecho()
> if len(regex) == 0:
> self.stats.fields_filter = DEFAULT_REGEX
> @@ -1204,7 +1208,7 @@ class Tui(object):
>
> curses.echo()
> self.screen.addstr(3, 0, "Pid [0 or pid]: ")
> - pid = self.screen.getstr()
> + pid = self.screen.getstr().decode(ENCODING)
> curses.noecho()
>
> try:
> @@ -1233,7 +1237,7 @@ class Tui(object):
> self.screen.addstr(2, 0, 'Change delay from %.1fs to ' %
> self._delay_regular)
> curses.echo()
> - val = self.screen.getstr()
> + val = self.screen.getstr().decode(ENCODING)
> curses.noecho()
>
> try:
> @@ -1273,7 +1277,7 @@ class Tui(object):
> self.print_all_gnames(7)
> curses.echo()
> self.screen.addstr(3, 0, "Guest [ENTER or guest]: ")
> - gname = self.screen.getstr()
> + gname = self.screen.getstr().decode(ENCODING)
> curses.noecho()
>
> if not gname:
> @@ -1369,25 +1373,25 @@ def batch(stats):
> s = stats.get()
> for key in sorted(s.keys()):
> values = s[key]
> - print '%-42s%10d%10d' % (key, values[0], values[1])
> + print('%-42s%10d%10d' % (key, values[0], values[1]))
> except KeyboardInterrupt:
> pass
>
>
> def log(stats):
> """Prints statistics as reiterating key block, multiple value blocks."""
> - keys = sorted(stats.get().iterkeys())
> + keys = sorted(stats.get().keys())
>
> def banner():
> for k in keys:
> - print '%s' % k,
> - print
> + print(k, end=' ')
> + print()
>
> def statline():
> s = stats.get()
> for k in keys:
> - print ' %9d' % s[k][1],
> - print
> + print(' %9d' % s[k][1], end=' ')
> + print()
> line = 0
> banner_repeat = 20
> while True:
> --
> 2.13.6
>
prev parent reply other threads:[~2017-10-05 18:05 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-04 3:08 [PATCH v2] tools/kvm_stat: Add Python 3 support to kvm_stat Jeremy Cline
2017-10-05 18:05 ` Radim Krčmář [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171005180526.GA5656@flask \
--to=rkrcmar@redhat.com \
--cc=jeremy@jcline.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.