diff --git a/py/__init__.py b/py/__init__.py index e70f1fbe9..e2f9fe857 100644 --- 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'), diff --git a/py/builtin/builtin31.py b/py/builtin/builtin31.py index 66ce47d4b..782e85573 100644 --- 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) diff --git a/py/builtin/testing/test_builtin.py b/py/builtin/testing/test_builtin.py index ec5cc84cd..cbf8d8e08 100644 --- 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 diff --git a/py/code/code.py b/py/code/code.py index 9477a1829..df84621a4 100644 --- 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 """ diff --git a/py/code/testing/test_excinfo.py b/py/code/testing/test_excinfo.py index 8348bb8f3..98238ea54 100644 --- 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): diff --git a/py/execnet/rsync.py b/py/execnet/rsync.py index 9c80fe99e..b565a6f78 100644 --- 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) diff --git a/py/path/testing/test_local.py b/py/path/testing/test_local.py index a338a48d3..46a91da73 100644 --- 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") diff --git a/py/process/cmdexec.py b/py/process/cmdexec.py index 6321d35c0..c0f7d5753 100644 --- 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) diff --git a/py/test/dist/dsession.py b/py/test/dist/dsession.py index db4b8f969..b593c05ae 100644 --- 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): diff --git a/py/test/dist/testing/test_txnode.py b/py/test/dist/testing/test_txnode.py index fe1af7a10..288207d78 100644 --- 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 diff --git a/py/thread/pool.py b/py/thread/pool.py index 553ba6036..90f52ae81 100644 --- 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()