diff --git a/_pytest/config.py b/_pytest/config.py index e573ec8ab..729575717 100644 --- a/_pytest/config.py +++ b/_pytest/config.py @@ -516,7 +516,9 @@ class Config(object): @classmethod def fromdictargs(cls, option_dict, args): """ constructor useable for subprocesses. """ - config = cls(PluginManager(load=True)) + from _pytest.core import get_plugin_manager + pluginmanager = get_plugin_manager() + config = cls(pluginmanager) # XXX slightly crude way to initialize capturing import _pytest.capture _pytest.capture.pytest_cmdline_parse(config.pluginmanager, args) diff --git a/_pytest/core.py b/_pytest/core.py index ceafe721c..6d8578d2f 100644 --- a/_pytest/core.py +++ b/_pytest/core.py @@ -460,8 +460,15 @@ class HookCaller: _preinit = [] def _preloadplugins(): + assert not _preinit _preinit.append(PluginManager(load=True)) +def get_plugin_manager(): + if _preinit: + return _preinit.pop(0) + else: # subsequent calls to main will create a fresh instance + return PluginManager(load=True) + def _prepareconfig(args=None, plugins=None): if args is None: args = sys.argv[1:] @@ -471,16 +478,12 @@ def _prepareconfig(args=None, plugins=None): if not isinstance(args, str): raise ValueError("not a string or argument list: %r" % (args,)) args = py.std.shlex.split(args) - if _preinit: - _pluginmanager = _preinit.pop(0) - else: # subsequent calls to main will create a fresh instance - _pluginmanager = PluginManager(load=True) - hook = _pluginmanager.hook + pluginmanager = get_plugin_manager() if plugins: for plugin in plugins: - _pluginmanager.register(plugin) - return hook.pytest_cmdline_parse( - pluginmanager=_pluginmanager, args=args) + pluginmanager.register(plugin) + return pluginmanager.hook.pytest_cmdline_parse( + pluginmanager=pluginmanager, args=args) def main(args=None, plugins=None): """ return exit code, after performing an in-process test run.