Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python3 support #80

Open
jridky opened this issue Mar 11, 2020 · 5 comments
Open

Python3 support #80

jridky opened this issue Mar 11, 2020 · 5 comments

Comments

@jridky
Copy link
Contributor

jridky commented Mar 11, 2020

Python 2 has reached it's EOL in January 2020. Are there any plans to migrate current Python 2 code to Python 3 version?

I know, there are some separate repositories with Python 3 port of your Python 2 code, but AFAIK, those aren't 100% functionally compatible with your Python 2 version.

@bvanassche
Copy link
Contributor

Is something like the patch below perhaps what you are looking for?

Subject: [PATCH] Convert Python 2 code to Python 3
---
 python/netsnmp/__init__.py   |   2 +-
 python/netsnmp/client.py     |   9 +-
 python/netsnmp/tests/test.py | 186 +++++++++++++++++------------------
 3 files changed, 99 insertions(+), 98 deletions(-)

diff --git a/python/netsnmp/__init__.py b/python/netsnmp/__init__.py
index 1d20dac07c33..421945bc425b 100644
--- a/python/netsnmp/__init__.py
+++ b/python/netsnmp/__init__.py
@@ -1 +1 @@
-from client import *
+from .client import *
diff --git a/python/netsnmp/client.py b/python/netsnmp/client.py
index 46a6e3786c7c..daf11a4c4acc 100644
--- a/python/netsnmp/client.py
+++ b/python/netsnmp/client.py
@@ -1,3 +1,4 @@
+from __future__ import print_function
 import re
 from sys import stderr
 import netsnmp
@@ -34,12 +35,12 @@ def _parse_session_args(kargs):
         'TheirHostname':'',
         'TrustCert':''
         }
-    keys = kargs.keys()
+    keys = list(kargs.keys())
     for key in keys:
-        if sessArgs.has_key(key):
+        if key in sessArgs:
             sessArgs[key] = kargs[key]
         else:
-            print >>stderr, "ERROR: unknown key", key
+            print("ERROR: unknown key", key, file=stderr)
     return sessArgs
 
 def STR(obj):
@@ -132,7 +133,7 @@ class Session(object):
 
         sess_args = _parse_session_args(args)
 
-        for k, v in sess_args.items():
+        for k, v in list(sess_args.items()):
             self.__dict__[k] = v
 
 
diff --git a/python/netsnmp/tests/test.py b/python/netsnmp/tests/test.py
index c71812b0831d..b1330faafeed 100644
--- a/python/netsnmp/tests/test.py
+++ b/python/netsnmp/tests/test.py
@@ -12,7 +12,7 @@ def snmp_dest(**kwargs):
         'DestHost':   'localhost:' + os.environ.get("SNMP_SNMPD_PORT", 161),
         'Community':  'public',
     }
-    for key, value in kwargs.iteritems():
+    for key, value in kwargs.items():
         dest[key] = value
     return dest
 
@@ -62,107 +62,107 @@ class BasicTests(unittest.TestCase):
         self.assertEqual(var.iid, '')
 
     def test_v1_get(self):
-        print "\n"
-        print "---v1 GET tests -------------------------------------\n"
+        print("\n")
+        print("---v1 GET tests -------------------------------------\n")
         var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0')
         res = netsnmp.snmpget(var, **snmp_dest())
 
-        print "v1 snmpget result: ", res, "\n"
+        print("v1 snmpget result: ", res, "\n")
         self.assertEqual(len(res), 1)
 
-        print "v1 get var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("v1 get var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(var.tag, 'sysDescr')
         self.assertEqual(var.iid, '0')
         self.assertEqual(var.val, res[0])
         self.assertEqual(var.type, 'OCTETSTR')
 
     def test_v1_getnext(self):
-        print "\n"
-        print "---v1 GETNEXT tests-------------------------------------\n"
+        print("\n")
+        print("---v1 GETNEXT tests-------------------------------------\n")
         var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0')
         res = netsnmp.snmpgetnext(var, **snmp_dest())
 
-        print "v1 snmpgetnext result: ", res, "\n"
+        print("v1 snmpgetnext result: ", res, "\n")
         self.assertEqual(len(res), 1)
 
-        print "v1 getnext var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("v1 getnext var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertTrue(var.tag is not None)
         self.assertTrue(var.iid is not None)
         self.assertTrue(var.val is not None)
         self.assertTrue(var.type is not None)
 
     def test_v1_set(self):
-        print "\n"
-        print "---v1 SET tests-------------------------------------\n"
+        print("\n")
+        print("---v1 SET tests-------------------------------------\n")
         var = netsnmp.Varbind('sysLocation', '0', 'my new location')
         res = netsnmp.snmpset(var, **snmp_dest())
 
-        print "v1 snmpset result: ", res, "\n"
+        print("v1 snmpset result: ", res, "\n")
         self.assertEqual(res, 1)
 
-        print "v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(var.tag, 'sysLocation')
         self.assertEqual(var.iid, '0')
         self.assertEqual(var.val, 'my new location')
         self.assertTrue(var.type is None)
 
     def test_v1_walk(self):
-        print "\n"
-        print "---v1 walk tests-------------------------------------\n"
+        print("\n")
+        print("---v1 walk tests-------------------------------------\n")
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
-        print "v1 varlist walk in: "
+        print("v1 varlist walk in: ")
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
         res = netsnmp.snmpwalk(varlist, **snmp_dest())
-        print "v1 snmpwalk result: ", res, "\n"
+        print("v1 snmpwalk result: ", res, "\n")
         self.assertTrue(len(res) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v1_walk_2(self):
-        print "\n"
-        print "---v1 walk 2-------------------------------------\n"
+        print("\n")
+        print("---v1 walk 2-------------------------------------\n")
 
-        print "v1 varbind walk in: "
+        print("v1 varbind walk in: ")
         var = netsnmp.Varbind('system')
         self.assertEqual(var.tag, 'system')
         self.assertEqual(var.iid, '')
         self.assertEqual(var.val, None)
         self.assertEqual(var.type, None)
         res = netsnmp.snmpwalk(var, **snmp_dest())
-        print "v1 snmpwalk result (should be = orig): ", res, "\n"
+        print("v1 snmpwalk result (should be = orig): ", res, "\n")
         self.assertTrue(len(res) > 0)
 
-        print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(var.tag, 'system')
         self.assertEqual(var.iid, '')
         self.assertEqual(var.val, None)
         self.assertEqual(var.type, None)
 
     def test_v1_mv_get(self):
-        print "\n"
-        print "---v1 multi-varbind test-------------------------------------\n"
+        print("\n")
+        print("---v1 multi-varbind test-------------------------------------\n")
         sess = setup_v1()
 
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         vals = sess.get(varlist)
-        print "v1 sess.get result: ", vals, "\n"
+        print("v1 sess.get result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
         vals = sess.getnext(varlist)
-        print "v1 sess.getnext result: ", vals, "\n"
+        print("v1 sess.getnext result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
                                   netsnmp.Varbind('sysORLastChange'),
@@ -171,71 +171,71 @@ class BasicTests(unittest.TestCase):
                                   netsnmp.Varbind('sysORUpTime'))
 
         vals = sess.getbulk(2, 8, varlist)
-        print "v1 sess.getbulk result: ", vals, "\n"
+        print("v1 sess.getbulk result: ", vals, "\n")
         self.assertEqual(vals, None) # GetBulk is not supported for v1
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v1_set_2(self):
-        print "\n"
-        print "---v1 set2-------------------------------------\n"
+        print("\n")
+        print("---v1 set2-------------------------------------\n")
 
         sess = setup_v1()
         varlist = netsnmp.VarList(
             netsnmp.Varbind('sysLocation', '0', 'my newer location'))
         res = sess.set(varlist)
-        print "v1 sess.set result: ", res, "\n"
+        print("v1 sess.set result: ", res, "\n")
 
     def test_v1_walk_3(self):
-        print "\n"
-        print "---v1 walk3-------------------------------------\n"
+        print("\n")
+        print("---v1 walk3-------------------------------------\n")
 
         sess = setup_v1()
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
         vals = sess.walk(varlist)
-        print "v1 sess.walk result: ", vals, "\n"
+        print("v1 sess.walk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v2c_get(self):
-        print "\n"
-        print "---v2c get-------------------------------------\n"
+        print("\n")
+        print("---v2c get-------------------------------------\n")
 
         sess = setup_v2()
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         vals = sess.get(varlist)
-        print "v2 sess.get result: ", vals, "\n"
+        print("v2 sess.get result: ", vals, "\n")
         self.assertEqual(len(vals), 3)
 
     def test_v2c_getnext(self):
-        print "\n"
-        print "---v2c getnext-------------------------------------\n"
+        print("\n")
+        print("---v2c getnext-------------------------------------\n")
 
         sess = setup_v2()
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
         vals = sess.getnext(varlist)
-        print "v2 sess.getnext result: ", vals, "\n"
+        print("v2 sess.getnext result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v2c_getbulk(self):
-        print "\n"
-        print "---v2c getbulk-------------------------------------\n"
+        print("\n")
+        print("---v2c getbulk-------------------------------------\n")
 
         sess = setup_v2()
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
@@ -245,16 +245,16 @@ class BasicTests(unittest.TestCase):
                                   netsnmp.Varbind('sysORUpTime'))
 
         vals = sess.getbulk(2, 8, varlist)
-        print "v2 sess.getbulk result: ", vals, "\n"
+        print("v2 sess.getbulk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v2c_set(self):
-        print "\n"
-        print "---v2c set-------------------------------------\n"
+        print("\n")
+        print("---v2c set-------------------------------------\n")
 
         sess = setup_v2()
 
@@ -262,54 +262,54 @@ class BasicTests(unittest.TestCase):
             netsnmp.Varbind('sysLocation', '0', 'my even newer location'))
 
         res = sess.set(varlist)
-        print "v2 sess.set result: ", res, "\n"
+        print("v2 sess.set result: ", res, "\n")
         self.assertEqual(res, 1)
 
     def test_v2c_walk(self):
-        print "\n"
-        print "---v2c walk-------------------------------------\n"
+        print("\n")
+        print("---v2c walk-------------------------------------\n")
 
         sess = setup_v2()
 
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
         vals = sess.walk(varlist)
-        print "v2 sess.walk result: ", vals, "\n"
+        print("v2 sess.walk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v3_get(self):
-        print "\n"
+        print("\n")
         sess = setup_v3();
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
-        print "---v3 get-------------------------------------\n"
+        print("---v3 get-------------------------------------\n")
         vals = sess.get(varlist)
-        print "v3 sess.get result: ", vals, "\n"
+        print("v3 sess.get result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v3_getnext(self):
-        print "\n"
-        print "---v3 getnext-------------------------------------\n"
+        print("\n")
+        print("---v3 getnext-------------------------------------\n")
 
         sess = setup_v3();
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         vals = sess.getnext(varlist)
-        print "v3 sess.getnext result: ", vals, "\n"
+        print("v3 sess.getnext result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v3_getbulk(self):
         sess = setup_v3();
@@ -320,47 +320,47 @@ class BasicTests(unittest.TestCase):
                                   netsnmp.Varbind('sysORUpTime'))
 
         vals = sess.getbulk(2, 8, varlist)
-        print "v3 sess.getbulk result: ", vals, "\n"
+        print("v3 sess.getbulk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v3_set(self):
-        print "\n"
-        print "---v3 set-------------------------------------\n"
+        print("\n")
+        print("---v3 set-------------------------------------\n")
 
         sess = setup_v3();
         varlist = netsnmp.VarList(
             netsnmp.Varbind('sysLocation', '0', 'my final destination'))
         res = sess.set(varlist)
-        print "v3 sess.set result: ", res, "\n"
+        print("v3 sess.set result: ", res, "\n")
         self.assertEqual(res, 1)
 
     def test_v3_walk(self):
-        print "\n"
-        print "---v3 walk-------------------------------------\n"
+        print("\n")
+        print("---v3 walk-------------------------------------\n")
         sess = setup_v3();
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
         vals = sess.walk(varlist)
-        print "v3 sess.walk result: ", vals, "\n"
+        print("v3 sess.walk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
 
 class SetTests(unittest.TestCase):
     """SNMP set tests for the Net-SNMP Python interface"""
     def testFuncs(self):
         """Test code"""
-        print "\n-------------- SET Test Start ----------------------------\n"
+        print("\n-------------- SET Test Start ----------------------------\n")
 
         var = netsnmp.Varbind('sysUpTime', '0')
         res = netsnmp.snmpget(var, **snmp_dest())
-        print "uptime = ", res[0]
+        print("uptime = ", res[0])
         self.assertEqual(len(res), 1)
 
 
@@ -370,19 +370,19 @@ class SetTests(unittest.TestCase):
 
         var = netsnmp.Varbind('sysUpTime', '0')
         res = netsnmp.snmpget(var, **snmp_dest())
-        print "uptime = ", res[0]
+        print("uptime = ", res[0])
         self.assertEqual(len(res), 1)
 
         var = netsnmp.Varbind('nsCacheEntry')
         res = netsnmp.snmpgetnext(var, **snmp_dest())
-        print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(len(res), 1)
 
         var.val = 65
         res = netsnmp.snmpset(var, **snmp_dest())
         self.assertEqual(res, 1)
         res = netsnmp.snmpget(var, **snmp_dest())
-        print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(len(res), 1)
         self.assertEqual(res[0], '65');
 
@@ -394,7 +394,7 @@ class SetTests(unittest.TestCase):
             netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 4))
         res = sess.set(varlist)
 
-        print "res = ", res
+        print("res = ", res)
         self.assertEqual(res, 1)
 
         varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'),
@@ -414,15 +414,15 @@ class SetTests(unittest.TestCase):
         self.assertEqual(varlist[2].val, '3')
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
         varlist = netsnmp.VarList(
             netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 6))
 
         res = sess.set(varlist)
 
-        print "res = ", res
+        print("res = ", res)
         self.assertEqual(res, 1)
 
         varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'),
@@ -436,10 +436,10 @@ class SetTests(unittest.TestCase):
         self.assertNotEqual(varlist[2].tag, 'snmpTargetAddrRowStatus')
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
-        print "\n-------------- SET Test End ----------------------------\n"
+        print("\n-------------- SET Test End ----------------------------\n")
 
 
 if __name__ == '__main__':

@jridky
Copy link
Contributor Author

jridky commented Mar 16, 2020

generally speaking, yes, something like this, but from what I have tried while ago, I know, more changes has to be done.

I have tried to prepare patch for Fedora 30 (see below). It's able to successfully build python3 code, but from end users I know, the functionality isn't the same as Python 2 version.

diff -urNp a/configure b/configure
--- a/configure	2018-07-18 17:11:53.178147565 +0200
+++ b/configure	2018-07-18 17:14:01.254774416 +0200
@@ -7742,8 +7742,8 @@ $as_echo "no" >&6; }
 fi
 
 
-# Extract the first word of "python", so it can be a program name with args.
-set dummy python; ac_word=$2
+# Extract the first word of "python3", so it can be a program name with args.
+set dummy python3; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_PYTHONPROG+:} false; then :
diff -urNp a/configure.d/config_os_progs b/configure.d/config_os_progs
--- a/configure.d/config_os_progs	2018-07-18 17:11:53.197147510 +0200
+++ b/configure.d/config_os_progs	2018-07-18 17:14:29.963690646 +0200
@@ -57,7 +57,7 @@ AC_PATH_PROG(AUTOCONF,    autoconf,   [:
 AC_PATH_PROG(AUTOHEADER,  autoheader, [:])
 AC_PATH_PROG([PERLPROG],  perl)
 AC_PATH_PROG([PSPROG],    ps)
-AC_PATH_PROG([PYTHONPROG],python)
+AC_PATH_PROG([PYTHONPROG],python3)
 
 AC_PATH_PROG([UNAMEPROG], uname)
 AC_DEFINE_UNQUOTED(UNAMEPROG,"$UNAMEPROG", [Where is the uname command])
diff -urNp a/Makefile.in b/Makefile.in
--- a/Makefile.in	2018-07-18 17:11:53.175147574 +0200
+++ b/Makefile.in	2018-07-18 17:16:21.331365317 +0200
@@ -226,7 +226,7 @@ perlcleanfeatures:
 
 # python specific build rules
 #
-PYMAKE=$(PYTHON) setup.py $(PYTHONARGS)
+PYMAKE=/usr/bin/python3 setup.py $(PYTHONARGS)
 pythonmodules: subdirs
 	@(dir=`pwd`; cd python; $(PYMAKE) build --basedir=$$dir) ; \
         if test $$? != 0 ; then \
diff -urNp a/python/netsnmp/client_intf.c b/python/netsnmp/client_intf.c
--- a/python/netsnmp/client_intf.c	2018-07-18 17:11:53.262147321 +0200
+++ b/python/netsnmp/client_intf.c	2018-07-18 17:33:16.495712833 +0200
@@ -1,11 +1,5 @@
 #include <Python.h>
 
-#if PY_VERSION_HEX < 0x02050000
-typedef int Py_ssize_t;
-#define PY_SSIZE_T_MAX INT_MAX
-#define PY_SSIZE_T_MIN INT_MIN
-#endif
-
 #include <net-snmp/net-snmp-config.h>
 #include <net-snmp/net-snmp-includes.h>
 #include <sys/types.h>
@@ -852,8 +846,40 @@ py_netsnmp_attr_string(PyObject *obj, ch
   if (obj && attr_name && PyObject_HasAttrString(obj, attr_name)) {
     PyObject *attr = PyObject_GetAttrString(obj, attr_name);
     if (attr) {
+      *val = PyUnicode_AsUTF8AndSize(attr, len);
+      Py_DECREF(attr);
+      return 0;
+    }
+  }
+
+  return -1;
+}
+
+static int
+py_netsnmp_attr_set_bytes(PyObject *obj, char *attr_name,
+         char *val, size_t len)
+{
+  int ret = -1;
+  if (obj && attr_name) {
+    PyObject* val_obj =  (val ?
+        PyBytes_FromStringAndSize(val, len) :
+        Py_BuildValue(""));
+    ret = PyObject_SetAttrString(obj, attr_name, val_obj);
+    Py_DECREF(val_obj);
+  }
+  return ret;
+}
+
+static int
+py_netsnmp_attr_bytes(PyObject *obj, char * attr_name, char **val,
+    Py_ssize_t *len)
+{
+  *val = NULL;
+  if (obj && attr_name && PyObject_HasAttrString(obj, attr_name)) {
+    PyObject *attr = PyObject_GetAttrString(obj, attr_name);
+    if (attr) {
       int retval;
-      retval = PyString_AsStringAndSize(attr, val, len);
+      retval = PyBytes_AsStringAndSize(attr, val, len);
       Py_DECREF(attr);
       return retval;
     }
@@ -870,7 +896,7 @@ py_netsnmp_attr_long(PyObject *obj, char
   if (obj && attr_name  && PyObject_HasAttrString(obj, attr_name)) {
     PyObject *attr = PyObject_GetAttrString(obj, attr_name);
     if (attr) {
-      val = PyInt_AsLong(attr);
+      val = PyLong_AsLong(attr);
       Py_DECREF(attr);
     }
   }
@@ -955,13 +981,13 @@ __py_netsnmp_update_session_errors(PyObj
 
     py_netsnmp_attr_set_string(session, "ErrorStr", err_str, STRLEN(err_str));
 
-    tmp_for_conversion = PyInt_FromLong(err_num);
+    tmp_for_conversion = PyLong_FromLong(err_num);
     if (!tmp_for_conversion)
         return; /* nothing better to do? */
     PyObject_SetAttrString(session, "ErrorNum", tmp_for_conversion);
     Py_DECREF(tmp_for_conversion);
 
-    tmp_for_conversion = PyInt_FromLong(err_ind);
+    tmp_for_conversion = PyLong_FromLong(err_ind);
     if (!tmp_for_conversion)
         return; /* nothing better to do? */
     PyObject_SetAttrString(session, "ErrorInd", tmp_for_conversion);
@@ -1323,7 +1349,7 @@ netsnmp_get(PyObject *self, PyObject *ar
 
     ss = (SnmpSession *)py_netsnmp_attr_void_ptr(session, "sess_ptr");
 
-    if (py_netsnmp_attr_string(session, "ErrorStr", &tmpstr, &tmplen) < 0) {
+    if (py_netsnmp_attr_bytes(session, "ErrorStr", &tmpstr, &tmplen) < 0) {
       goto done;
     }
 
@@ -2015,7 +2041,7 @@ netsnmp_walk(PyObject *self, PyObject *a
                                         vars, tp, type, sprintval_flag);
                   str_buf[len] = '\0';
 
-                  py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf,
+                  py_netsnmp_attr_set_bytes(varbind, "val", (char *) str_buf,
                                              len);
 
                   /* push the varbind onto the return varbinds */
@@ -2266,7 +2292,7 @@ netsnmp_getbulk(PyObject *self, PyObject
 
 	    __get_type_str(type, type_str);
 
-	    py_netsnmp_attr_set_string(varbind, "type", type_str,
+	    py_netsnmp_attr_set_bytes(varbind, "type", type_str,
 				       strlen(type_str));
 
 	    len = __snprint_value((char **)&str_buf, &str_buf_len,
@@ -2409,7 +2435,7 @@ netsnmp_set(PyObject *self, PyObject *ar
 	  }
 	}
 
-	if (py_netsnmp_attr_string(varbind, "val", &val, &tmplen) < 0) {
+	if (py_netsnmp_attr_bytes(varbind, "val", &val, &tmplen) < 0) {
 	  snmp_free_pdu(pdu);
 	  goto done;
 	}
@@ -2467,7 +2493,6 @@ netsnmp_set(PyObject *self, PyObject *ar
   return (ret ? ret : Py_BuildValue(""));
 }
 
-
 static PyMethodDef ClientMethods[] = {
   {"session",  netsnmp_create_session, METH_VARARGS,
    "create a netsnmp session."},
@@ -2490,10 +2515,23 @@ static PyMethodDef ClientMethods[] = {
   {NULL, NULL, 0, NULL}        /* Sentinel */
 };
 
+static struct PyModuleDef ModuleDefinition = {
+  PyModuleDef_HEAD_INIT,
+  "client_intf",
+  NULL,
+  -1,
+  ClientMethods,
+  NULL,
+  NULL,
+  NULL,
+  NULL
+};
+
 PyMODINIT_FUNC
-initclient_intf(void)
+PyInit_client_intf(void)
 {
-    (void) Py_InitModule("client_intf", ClientMethods);
+    PyObject *module = PyModule_Create(&ModuleDefinition);
+    return module;
 }
 
 
diff -urNp a/python/netsnmp/client.py b/python/netsnmp/client.py
--- a/python/netsnmp/client.py	2018-07-18 17:11:53.262147321 +0200
+++ b/python/netsnmp/client.py	2018-07-18 17:37:10.489221397 +0200
@@ -34,12 +34,12 @@ def _parse_session_args(kargs):
         'TheirHostname':'',
         'TrustCert':''
         }
-    keys = kargs.keys()
+    keys = list(kargs.keys())
     for key in keys:
-        if sessArgs.has_key(key):
+        if key in sessArgs:
             sessArgs[key] = kargs[key]
         else:
-            print >>stderr, "ERROR: unknown key", key
+            print("ERROR: unknown key", key, file=stderr)
     return sessArgs
 
 def STR(obj):
@@ -55,7 +55,7 @@ class Varbind(object):
     def __init__(self, tag=None, iid=None, val=None, type_arg=None):
         self.tag = STR(tag)
         self.iid = STR(iid)
-        self.val = STR(val)
+        self.val = val
         self.type = STR(type_arg)
         # parse iid out of tag if needed
         if iid is None and tag is not None:
@@ -65,7 +65,10 @@ class Varbind(object):
                 (self.tag, self.iid) = match.group(1, 2)
 
     def __setattr__(self, name, val):
-        self.__dict__[name] = STR(val)
+        if name == 'val':
+            self.__dict__[name] = val
+        else:
+            self.__dict__[name] = STR(val)
 
     def __str__(self):
         return obj_to_str(self)
@@ -132,7 +135,7 @@ class Session(object):
 
         sess_args = _parse_session_args(args)
 
-        for k, v in sess_args.items():
+        for k, v in list(sess_args.items()):
             self.__dict__[k] = v
 
 
diff -urNp a/python/netsnmp/__init__.py b/python/netsnmp/__init__.py
--- a/python/netsnmp/__init__.py	2018-07-18 17:11:53.262147321 +0200
+++ b/python/netsnmp/__init__.py	2018-07-18 17:37:32.553172525 +0200
@@ -1 +1 @@
-from client import *
+from .client import *
diff -urNp a/python/netsnmp/tests/test.py b/python/netsnmp/tests/test.py
--- a/python/netsnmp/tests/test.py	2018-07-18 17:11:53.263147318 +0200
+++ b/python/netsnmp/tests/test.py	2018-07-18 17:38:21.272063355 +0200
@@ -12,7 +12,7 @@ def snmp_dest(**kwargs):
         'DestHost':   'localhost:' + os.environ.get("SNMP_SNMPD_PORT", 161),
         'Community':  'public',
     }
-    for key, value in kwargs.iteritems():
+    for key, value in kwargs.items():
         dest[key] = value
     return dest
 
@@ -62,107 +62,107 @@ class BasicTests(unittest.TestCase):
         self.assertEqual(var.iid, '')
 
     def test_v1_get(self):
-        print "\n"
-        print "---v1 GET tests -------------------------------------\n"
+        print("\n")
+        print("---v1 GET tests -------------------------------------\n")
         var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0')
         res = netsnmp.snmpget(var, **snmp_dest())
 
-        print "v1 snmpget result: ", res, "\n"
+        print("v1 snmpget result: ", res, "\n")
         self.assertEqual(len(res), 1)
 
-        print "v1 get var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("v1 get var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(var.tag, 'sysDescr')
         self.assertEqual(var.iid, '0')
         self.assertEqual(var.val, res[0])
         self.assertEqual(var.type, 'OCTETSTR')
 
     def test_v1_getnext(self):
-        print "\n"
-        print "---v1 GETNEXT tests-------------------------------------\n"
+        print("\n")
+        print("---v1 GETNEXT tests-------------------------------------\n")
         var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0')
         res = netsnmp.snmpgetnext(var, **snmp_dest())
 
-        print "v1 snmpgetnext result: ", res, "\n"
+        print("v1 snmpgetnext result: ", res, "\n")
         self.assertEqual(len(res), 1)
 
-        print "v1 getnext var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("v1 getnext var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertTrue(var.tag is not None)
         self.assertTrue(var.iid is not None)
         self.assertTrue(var.val is not None)
         self.assertTrue(var.type is not None)
 
     def test_v1_set(self):
-        print "\n"
-        print "---v1 SET tests-------------------------------------\n"
+        print("\n")
+        print("---v1 SET tests-------------------------------------\n")
         var = netsnmp.Varbind('sysLocation', '0', 'my new location')
         res = netsnmp.snmpset(var, **snmp_dest())
 
-        print "v1 snmpset result: ", res, "\n"
+        print("v1 snmpset result: ", res, "\n")
         self.assertEqual(res, 1)
 
-        print "v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(var.tag, 'sysLocation')
         self.assertEqual(var.iid, '0')
         self.assertEqual(var.val, 'my new location')
         self.assertTrue(var.type is None)
 
     def test_v1_walk(self):
-        print "\n"
-        print "---v1 walk tests-------------------------------------\n"
+        print("\n")
+        print("---v1 walk tests-------------------------------------\n")
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
-        print "v1 varlist walk in: "
+        print("v1 varlist walk in: ")
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
         res = netsnmp.snmpwalk(varlist, **snmp_dest())
-        print "v1 snmpwalk result: ", res, "\n"
+        print("v1 snmpwalk result: ", res, "\n")
         self.assertTrue(len(res) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v1_walk_2(self):
-        print "\n"
-        print "---v1 walk 2-------------------------------------\n"
+        print("\n")
+        print("---v1 walk 2-------------------------------------\n")
 
-        print "v1 varbind walk in: "
+        print("v1 varbind walk in: ")
         var = netsnmp.Varbind('system')
         self.assertEqual(var.tag, 'system')
         self.assertEqual(var.iid, '')
         self.assertEqual(var.val, None)
         self.assertEqual(var.type, None)
         res = netsnmp.snmpwalk(var, **snmp_dest())
-        print "v1 snmpwalk result (should be = orig): ", res, "\n"
+        print("v1 snmpwalk result (should be = orig): ", res, "\n")
         self.assertTrue(len(res) > 0)
 
-        print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(var.tag, 'system')
         self.assertEqual(var.iid, '')
         self.assertEqual(var.val, None)
         self.assertEqual(var.type, None)
 
     def test_v1_mv_get(self):
-        print "\n"
-        print "---v1 multi-varbind test-------------------------------------\n"
+        print("\n")
+        print("---v1 multi-varbind test-------------------------------------\n")
         sess = setup_v1()
 
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         vals = sess.get(varlist)
-        print "v1 sess.get result: ", vals, "\n"
+        print("v1 sess.get result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
         vals = sess.getnext(varlist)
-        print "v1 sess.getnext result: ", vals, "\n"
+        print("v1 sess.getnext result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
                                   netsnmp.Varbind('sysORLastChange'),
@@ -171,71 +171,71 @@ class BasicTests(unittest.TestCase):
                                   netsnmp.Varbind('sysORUpTime'))
 
         vals = sess.getbulk(2, 8, varlist)
-        print "v1 sess.getbulk result: ", vals, "\n"
+        print("v1 sess.getbulk result: ", vals, "\n")
         self.assertEqual(vals, None) # GetBulk is not supported for v1
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v1_set_2(self):
-        print "\n"
-        print "---v1 set2-------------------------------------\n"
+        print("\n")
+        print("---v1 set2-------------------------------------\n")
 
         sess = setup_v1()
         varlist = netsnmp.VarList(
             netsnmp.Varbind('sysLocation', '0', 'my newer location'))
         res = sess.set(varlist)
-        print "v1 sess.set result: ", res, "\n"
+        print("v1 sess.set result: ", res, "\n")
 
     def test_v1_walk_3(self):
-        print "\n"
-        print "---v1 walk3-------------------------------------\n"
+        print("\n")
+        print("---v1 walk3-------------------------------------\n")
 
         sess = setup_v1()
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
         vals = sess.walk(varlist)
-        print "v1 sess.walk result: ", vals, "\n"
+        print("v1 sess.walk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v2c_get(self):
-        print "\n"
-        print "---v2c get-------------------------------------\n"
+        print("\n")
+        print("---v2c get-------------------------------------\n")
 
         sess = setup_v2()
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         vals = sess.get(varlist)
-        print "v2 sess.get result: ", vals, "\n"
+        print("v2 sess.get result: ", vals, "\n")
         self.assertEqual(len(vals), 3)
 
     def test_v2c_getnext(self):
-        print "\n"
-        print "---v2c getnext-------------------------------------\n"
+        print("\n")
+        print("---v2c getnext-------------------------------------\n")
 
         sess = setup_v2()
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
         vals = sess.getnext(varlist)
-        print "v2 sess.getnext result: ", vals, "\n"
+        print("v2 sess.getnext result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v2c_getbulk(self):
-        print "\n"
-        print "---v2c getbulk-------------------------------------\n"
+        print("\n")
+        print("---v2c getbulk-------------------------------------\n")
 
         sess = setup_v2()
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
@@ -245,16 +245,16 @@ class BasicTests(unittest.TestCase):
                                   netsnmp.Varbind('sysORUpTime'))
 
         vals = sess.getbulk(2, 8, varlist)
-        print "v2 sess.getbulk result: ", vals, "\n"
+        print("v2 sess.getbulk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v2c_set(self):
-        print "\n"
-        print "---v2c set-------------------------------------\n"
+        print("\n")
+        print("---v2c set-------------------------------------\n")
 
         sess = setup_v2()
 
@@ -262,54 +262,54 @@ class BasicTests(unittest.TestCase):
             netsnmp.Varbind('sysLocation', '0', 'my even newer location'))
 
         res = sess.set(varlist)
-        print "v2 sess.set result: ", res, "\n"
+        print("v2 sess.set result: ", res, "\n")
         self.assertEqual(res, 1)
 
     def test_v2c_walk(self):
-        print "\n"
-        print "---v2c walk-------------------------------------\n"
+        print("\n")
+        print("---v2c walk-------------------------------------\n")
 
         sess = setup_v2()
 
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
         vals = sess.walk(varlist)
-        print "v2 sess.walk result: ", vals, "\n"
+        print("v2 sess.walk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
     def test_v3_get(self):
-        print "\n"
+        print("\n")
         sess = setup_v3();
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
-        print "---v3 get-------------------------------------\n"
+        print("---v3 get-------------------------------------\n")
         vals = sess.get(varlist)
-        print "v3 sess.get result: ", vals, "\n"
+        print("v3 sess.get result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v3_getnext(self):
-        print "\n"
-        print "---v3 getnext-------------------------------------\n"
+        print("\n")
+        print("---v3 getnext-------------------------------------\n")
 
         sess = setup_v3();
         varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
                                   netsnmp.Varbind('sysContact', 0),
                                   netsnmp.Varbind('sysLocation', 0))
         vals = sess.getnext(varlist)
-        print "v3 sess.getnext result: ", vals, "\n"
+        print("v3 sess.getnext result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v3_getbulk(self):
         sess = setup_v3();
@@ -320,47 +320,47 @@ class BasicTests(unittest.TestCase):
                                   netsnmp.Varbind('sysORUpTime'))
 
         vals = sess.getbulk(2, 8, varlist)
-        print "v3 sess.getbulk result: ", vals, "\n"
+        print("v3 sess.getbulk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
     def test_v3_set(self):
-        print "\n"
-        print "---v3 set-------------------------------------\n"
+        print("\n")
+        print("---v3 set-------------------------------------\n")
 
         sess = setup_v3();
         varlist = netsnmp.VarList(
             netsnmp.Varbind('sysLocation', '0', 'my final destination'))
         res = sess.set(varlist)
-        print "v3 sess.set result: ", res, "\n"
+        print("v3 sess.set result: ", res, "\n")
         self.assertEqual(res, 1)
 
     def test_v3_walk(self):
-        print "\n"
-        print "---v3 walk-------------------------------------\n"
+        print("\n")
+        print("---v3 walk-------------------------------------\n")
         sess = setup_v3();
         varlist = netsnmp.VarList(netsnmp.Varbind('system'))
 
         vals = sess.walk(varlist)
-        print "v3 sess.walk result: ", vals, "\n"
+        print("v3 sess.walk result: ", vals, "\n")
         self.assertTrue(len(vals) > 0)
 
         for var in varlist:
-            print "  ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
 
 
 class SetTests(unittest.TestCase):
     """SNMP set tests for the Net-SNMP Python interface"""
     def testFuncs(self):
         """Test code"""
-        print "\n-------------- SET Test Start ----------------------------\n"
+        print("\n-------------- SET Test Start ----------------------------\n")
 
         var = netsnmp.Varbind('sysUpTime', '0')
         res = netsnmp.snmpget(var, **snmp_dest())
-        print "uptime = ", res[0]
+        print("uptime = ", res[0])
         self.assertEqual(len(res), 1)
 
 
@@ -370,19 +370,19 @@ class SetTests(unittest.TestCase):
 
         var = netsnmp.Varbind('sysUpTime', '0')
         res = netsnmp.snmpget(var, **snmp_dest())
-        print "uptime = ", res[0]
+        print("uptime = ", res[0])
         self.assertEqual(len(res), 1)
 
         var = netsnmp.Varbind('nsCacheEntry')
         res = netsnmp.snmpgetnext(var, **snmp_dest())
-        print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(len(res), 1)
 
         var.val = 65
         res = netsnmp.snmpset(var, **snmp_dest())
         self.assertEqual(res, 1)
         res = netsnmp.snmpget(var, **snmp_dest())
-        print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
+        print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
         self.assertEqual(len(res), 1)
         self.assertEqual(res[0], '65');
 
@@ -394,7 +394,7 @@ class SetTests(unittest.TestCase):
             netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 4))
         res = sess.set(varlist)
 
-        print "res = ", res
+        print("res = ", res)
         self.assertEqual(res, 1)
 
         varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'),
@@ -414,15 +414,15 @@ class SetTests(unittest.TestCase):
         self.assertEqual(varlist[2].val, '3')
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
         varlist = netsnmp.VarList(
             netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 6))
 
         res = sess.set(varlist)
 
-        print "res = ", res
+        print("res = ", res)
         self.assertEqual(res, 1)
 
         varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'),
@@ -436,10 +436,10 @@ class SetTests(unittest.TestCase):
         self.assertNotEqual(varlist[2].tag, 'snmpTargetAddrRowStatus')
 
         for var in varlist:
-            print var.tag, var.iid, "=", var.val, '(', var.type, ')'
-        print "\n"
+            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
+        print("\n")
 
-        print "\n-------------- SET Test End ----------------------------\n"
+        print("\n-------------- SET Test End ----------------------------\n")
 
 
 if __name__ == '__main__':
diff -urNp a/python/setup.py b/python/setup.py
--- a/python/setup.py	2018-07-18 17:11:53.262147321 +0200
+++ b/python/setup.py	2018-07-18 17:40:36.922751382 +0200
@@ -9,9 +9,9 @@ intree=0
 
 args = sys.argv[:]
 for arg in args:
-    if string.find(arg,'--basedir=') == 0:
-        basedir = string.split(arg,'=')[1]
-	sys.argv.remove(arg)
+    if arg.find('--basedir=') == 0:
+        basedir = arg.split('=')[1]
+        sys.argv.remove(arg) #tabs
         intree=1
 
 if intree:

@bvanassche
Copy link
Contributor

Can you have a look at the patches that I checked in on the v5.8 and master branches and verify whether that code works as expected? The changes have been made such that the Net-SNMP Python code still compiles when the Python interpreter is changed back to Python 2.

@lijog
Copy link
Contributor

lijog commented May 11, 2020

I've tested the recent Python3 changes in a Solaris11 environment, which has the 5.8 stable version of net-snmp. There were a couple of changes which were required for the tests to pass. I've attached the changes, all the tests pass with the following changes included.

net-snmp-py3-extra.txt

bvanassche added a commit to bvanassche/net-snmp that referenced this issue May 15, 2020
See also net-snmp#80.

[ bvanassche: Removed commented out code and fixed compiler warnings ]
@bvanassche
Copy link
Contributor

A modified patch has been applied on the v5.8 and master branches. Please retest. Anyway, thanks for the patch!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants