[py-svn] py-trunk commit 270ff4410124: introduce py.builtin._tryimport to try importing modules in a row, fix a few places

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Fri Sep 4 19:08:52 CEST 2009


# HG changeset patch -- Bitbucket.org
# Project py-trunk
# URL http://bitbucket.org/hpk42/py-trunk/overview/
# User holger krekel <holger at merlinux.eu>
# Date 1252084090 -7200
# Node ID 270ff441012481c31a531c6c169a79790503f2cf
# Parent 622317fe7b5be200fd471fde56b59d4321f5d927
introduce py.builtin._tryimport to try importing modules in a row, fix a few places

--- a/py/builtin/builtin31.py
+++ b/py/builtin/builtin31.py
@@ -1,4 +1,4 @@
-
+import py
 import sys
 
 if sys.version_info >= (3, 0):
@@ -105,3 +105,13 @@ def _reraise(cls, val, tb):
 def exec2(obj, globals, locals):
     exec obj in globals, locals 
 """)
+
+def _tryimport(*names):
+    """ return the first successfully imported module. """ 
+    assert names
+    for name in names:
+        try:
+            return __import__(name, None, None, '__doc__')
+        except ImportError:
+            excinfo = sys.exc_info()
+    py.builtin._reraise(*excinfo)

--- a/py/builtin/testing/test_builtin.py
+++ b/py/builtin/testing/test_builtin.py
@@ -139,3 +139,10 @@ def test_exec():
     d = {}
     py.builtin.exec_("x=4", d)
     assert d['x'] == 4
+
+def test_tryimport():
+    py.test.raises(ImportError, py.builtin._tryimport, 'xqwe123')
+    x = py.builtin._tryimport('asldkajsdl', 'py')
+    assert x == py
+    x = py.builtin._tryimport('asldkajsdl', 'py.path')
+    assert x == py.path

--- a/py/process/cmdexec.py
+++ b/py/process/cmdexec.py
@@ -12,6 +12,7 @@ Current list:
 
 import os, sys
 import py
+from subprocess import Popen, PIPE
 
 #-----------------------------------------------------------
 # posix external command execution
@@ -24,15 +25,10 @@ def posix_exec_cmd(cmd):
     the error-output from the command.
     """
     #__tracebackhide__ = True
-    try:
-        from subprocess import Popen, PIPE
-    except ImportError:
-        from py.__.compat.subprocess import Popen, PIPE
 
     import errno
 
-    child = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE,
-                                                                close_fds=True)
+    child = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True)
     stdin, stdout, stderr = child.stdin, child.stdout, child.stderr
 
     # XXX sometimes we get a blocked r.read() call (see below)

--- a/py/__init__.py
+++ b/py/__init__.py
@@ -146,6 +146,7 @@ initpkg(__name__,
     'builtin.GeneratorExit'  : ('./builtin/builtin25.py', 'GeneratorExit'),
     'builtin.print_'         : ('./builtin/builtin31.py', 'print_'),
     'builtin._reraise'       : ('./builtin/builtin31.py', '_reraise'),
+    'builtin._tryimport'     : ('./builtin/builtin31.py', '_tryimport'),
     'builtin.exec_'          : ('./builtin/builtin31.py', 'exec_'),
     'builtin._basestring'    : ('./builtin/builtin31.py', '_basestring'),
     'builtin._totext'        : ('./builtin/builtin31.py', '_totext'),

--- a/py/test/dist/dsession.py
+++ b/py/test/dist/dsession.py
@@ -8,10 +8,7 @@ import py
 from py.__.test.session import Session
 from py.__.test import outcome 
 from py.__.test.dist.nodemanage import NodeManager
-try:
-    import queue 
-except ImportError:
-    import Queue as queue
+queue = py.builtin._tryimport('queue', 'Queue')
 
 debug_file = None # open('/tmp/loop.log', 'w')
 def debug(*args):

--- a/py/code/testing/test_excinfo.py
+++ b/py/code/testing/test_excinfo.py
@@ -1,10 +1,7 @@
-try:
-    import Queue as queue
-except ImportError:
-    import queue
 
 import py
 from py.__.code.code import FormattedExcinfo, ReprExceptionInfo
+queue = py.builtin._tryimport('queue', 'Queue')
 
 class TWMock: 
     def __init__(self):

--- a/py/code/code.py
+++ b/py/code/code.py
@@ -2,11 +2,8 @@ import py
 import sys
 
 builtin_repr = repr
-try:
-    import repr
-except ImportError:
-    import reprlib as repr 
 
+repr = py.builtin._tryimport('repr', 'reprlib')
 
 class Code(object):
     """ wrapper around Python code objects """

--- a/py/thread/pool.py
+++ b/py/thread/pool.py
@@ -2,10 +2,8 @@ import threading
 import time 
 import sys
 import py
-try:
-    import queue 
-except ImportError:
-    import Queue as queue
+
+queue = py.builtin._tryimport('queue', 'Queue')
 
 ERRORMARKER = object() 
 

--- a/py/test/dist/testing/test_txnode.py
+++ b/py/test/dist/testing/test_txnode.py
@@ -1,11 +1,12 @@
 
 import py
 from py.__.test.dist.txnode import TXNode
+Queue = py.builtin._tryimport("queue.Queue", "Queue.Queue")
 
 class EventQueue:
     def __init__(self, registry, queue=None):
         if queue is None:
-            queue = py.std.Queue.Queue()
+            queue = Queue()
         self.queue = queue
         registry.register(self)
 
@@ -43,7 +44,7 @@ class MySetup:
         if config is None:
             config = py.test.config._reparse([])
         self.config = config
-        self.queue = py.std.Queue.Queue()
+        self.queue = Queue()
         self.xspec = py.execnet.XSpec("popen")
         self.gateway = py.execnet.makegateway(self.xspec)
         self.id += 1

--- a/py/path/testing/test_local.py
+++ b/py/path/testing/test_local.py
@@ -39,12 +39,8 @@ class TestLocalPath(common.CommonFSTests
         assert p == tmpdir
 
     def test_gethash(self, tmpdir):
-        try:
-            from md5 import md5
-            from sha import sha
-        except ImportError:
-            from hashlib import md5 as md5
-            from hashlib import sha1 as sha
+        md5 = py.builtin._tryimport('md5.md5', 'hashlib.md5')
+        sha = py.builtin._tryimport('sha.sha', 'hashlib.sha1')
         fn = tmpdir.join("testhashfile")
         data = 'hello'.encode('ascii')
         fn.write(data, mode="wb")

--- a/py/execnet/rsync.py
+++ b/py/execnet/rsync.py
@@ -1,12 +1,7 @@
 import py, os, stat
-try:
-    from hashlib import md5
-except ImportError:
-    from md5 import md5
-try:
-    from queue import Queue
-except ImportError:
-    from Queue import Queue
+
+md5 = py.builtin._tryimport('hashlib.md5', 'md5.md5')
+queue = py.builtin._tryimport('queue.Queue', 'Queue.Queue')
 
 class RSync(object):
     """ This class allows to send a directory structure (recursively)



More information about the pytest-commit mailing list