From issues-reply at bitbucket.org Tue Aug 2 23:22:08 2016 From: issues-reply at bitbucket.org (Danilo Bellini) Date: Wed, 03 Aug 2016 03:22:08 -0000 Subject: [Pytest-commit] Issue #353: More verbose when installing deps! (hpk42/tox) Message-ID: <20160803032208.66717.83247@celery-worker-102.ash1.bb-inf.net> New issue 353: More verbose when installing deps! https://bitbucket.org/hpk42/tox/issues/353/more-verbose-when-installing-deps Danilo Bellini: I've got some projects whose requirements take a long time until pip installs all the deps, e.g., projects that require scipy. Running such projects in a CI results in a timeout error before the installation finishes, due to the lack of new output for too long. In the past I tried to install these packages as part of the commands, but as I said, it takes too long, that's not something I wish to reinstall every time I'm calling the tox for testing my code. And even if I call `pip install -I` in my commands, the CI wouldn't be able to distinguish between an installation error (the ones that might happen when I call `tox --notest` during installation) and an actual project failure. I think there should be a verbosity level that shows the installer outputs while it's installing the deps. From issues-reply at bitbucket.org Wed Aug 3 00:10:17 2016 From: issues-reply at bitbucket.org (Nick Coghlan) Date: Wed, 03 Aug 2016 04:10:17 -0000 Subject: [Pytest-commit] Issue #354: RFE: Use "--ignore-installed" by default when global site packages is enabled (hpk42/tox) Message-ID: <20160803041017.25288.91318@celery-worker-104.ash1.bb-inf.net> New issue 354: RFE: Use "--ignore-installed" by default when global site packages is enabled https://bitbucket.org/hpk42/tox/issues/354/rfe-use-ignore-installed-by-default-when Nick Coghlan: Working on the use case described in https://bitbucket.org/hpk42/tox/issues/236/tox-must-create-the-source-distribution#comment-29617000 I ran into an interestingly cryptic error message related to nosetests: tox was attempting to use the system nose installation, even though I'd explicitly specified it as a dependency to be installed into the virtual environment. I eventually figured out the problem, and was able to workaround it by overriding `install_command` to add "--ignore-installed" to the default settings. That meant everything declared as a dependency would be installed into the virtual environment, even if it already existing in the system site packages, leaving the latter to be used only for the components not available in a venv friendly format. From issues-reply at bitbucket.org Sat Aug 6 10:02:22 2016 From: issues-reply at bitbucket.org (Oliver Bestwalter) Date: Sat, 06 Aug 2016 14:02:22 -0000 Subject: [Pytest-commit] Issue #355: Setting environment variable crashes with posargs (hpk42/tox) Message-ID: <20160806140222.8848.39729@celery-worker-101.ash1.bb-inf.net> New issue 355: Setting environment variable crashes with posargs https://bitbucket.org/hpk42/tox/issues/355/setting-environment-variable-crashes-with Oliver Bestwalter: On tox 2.4.0.dev1: ``` [testenv] setenv = ; works TOX_ENVNAME = {envname} TOX_TOXINIDIR = {toxinidir} TOX_TOXWORKDIR = {toxworkdir} ; crashes TOX_POSARGS = {posargs} ``` It works with all other variables as far as I can say, only with posargs it crashes with ``` Traceback (most recent call last): File "/home/oliver/.pyenv/versions/avira/bin/tox", line 9, in load_entry_point('tox', 'console_scripts', 'tox')() File "/home/oliver/work/pytest/tox/tox/session.py", line 39, in main retcode = Session(config).runcommand() File "/home/oliver/work/pytest/tox/tox/session.py", line 382, in runcommand return self.subcommand_test() File "/home/oliver/work/pytest/tox/tox/session.py", line 547, in subcommand_test action=action) File "/home/oliver/work/pytest/tox/tox/venv.py", line 372, in _pcall env = self._getenv(testcommand=testcommand) File "/home/oliver/work/pytest/tox/tox/venv.py", line 314, in _getenv env.update(self.envconfig.setenv) File "/home/oliver/work/pytest/tox/tox/config.py", line 295, in __getitem__ x = self.get(name, _dummy) File "/home/oliver/work/pytest/tox/tox/config.py", line 289, in get self.resolved[name] = res = self.reader._replace(val) File "/home/oliver/work/pytest/tox/tox/config.py", line 1010, in _replace return Replacer(self, crossonly=crossonly).do_replace(value) File "/home/oliver/work/pytest/tox/tox/config.py", line 1029, in do_replace return self.RE_ITEM_REF.sub(self._replace_match, x) File "/home/oliver/work/pytest/tox/tox/config.py", line 1058, in _replace_match return self._replace_substitution(match) File "/home/oliver/work/pytest/tox/tox/config.py", line 1104, in _replace_substitution val = self._substitute_from_other_section(sub_key) File "/home/oliver/work/pytest/tox/tox/config.py", line 1098, in _substitute_from_other_section "substitution key %r not found" % key) tox.ConfigError: ConfigError: substitution key 'posargs' not found ``` From issues-reply at bitbucket.org Sat Aug 6 10:10:54 2016 From: issues-reply at bitbucket.org (Oliver Bestwalter) Date: Sat, 06 Aug 2016 14:10:54 -0000 Subject: [Pytest-commit] Issue #356: Feature proposal: add toxvars automatically to environment (hpk42/tox) Message-ID: <20160806141054.15261.19057@celery-worker-103.ash1.bb-inf.net> New issue 356: Feature proposal: add toxvars automatically to environment https://bitbucket.org/hpk42/tox/issues/356/feature-proposal-add-toxvars-automatically Oliver Bestwalter: I am playing around with a test setup that includes lots of packages and I want to unify testing between them. Instead of having lots of redundancy in the tox.inis they would be kept simple and in sync by handling the details through a script that can be maintained centrally. For example: Instead of saying `unittests: py.test --junitxml={posargs:{toxworkdir}}/{envname}.xml --cov-config tests/settings/.coveragerc --cov --cov-report html tests/unit` in tons of tox.inis, it would be (using a script called e.g. runtests that deals with the details): `unittests: runtests unit` To make that work I would have to do ``` [testenv] setenv = TOX_ENVNAME = {envname} ; NOTE: using posargs like this crashes atm see #355 TOX_POSARGS = {posargs} TOX_TOXINIDIR = {toxinidir} TOX_TOXWORKDIR = {toxworkdir} [...] ``` I was wondering what you think about enriching the environment automatically with all values that are accessible in tox.ini via {value}? you would do ``` [testenv] addtoxvarstoenv = True ``` Or this could even be the default? That would add all of them in one fell swoop. Naming convention could be like above `TOX_`. At the moment adding this would be blocked by #355. From commits-noreply at bitbucket.org Sun Aug 7 13:45:29 2016 From: commits-noreply at bitbucket.org (commits-noreply at bitbucket.org) Date: Sun, 07 Aug 2016 17:45:29 -0000 Subject: [Pytest-commit] commit/tox: Oliver Bestwalter: catch project deletion if envdir==toxinidir Message-ID: <20160807174529.36683.76534@celery-worker-102.ash1.bb-inf.net> 1 new commit in tox: https://bitbucket.org/hpk42/tox/commits/4c796666bede/ Changeset: 4c796666bede Branch: issue352 User: Oliver Bestwalter Date: 2016-08-07 17:45:18+00:00 Summary: catch project deletion if envdir==toxinidir Affected #: 1 file diff -r 19a03d4e500ba859631bce6f6999de09b1a48cde -r 4c796666bedef8040e7d40d6f0d00bb9b86d47d0 tox/session.py --- a/tox/session.py +++ b/tox/session.py @@ -356,6 +356,10 @@ if envconfig is None: self.report.error("unknown environment %r" % name) raise LookupError(name) + elif envconfig.envdir == self.config.toxinidir: + self.report.error( + "venv in %s would delete project" % envconfig.envdir) + raise tox.exception.ConfigError('envdir must not equal toxinidir') venv = VirtualEnv(envconfig=envconfig, session=self) self._name2venv[name] = venv return venv Repository URL: https://bitbucket.org/hpk42/tox/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. From issues-reply at bitbucket.org Tue Aug 9 00:19:34 2016 From: issues-reply at bitbucket.org (Daniel Nunes) Date: Tue, 09 Aug 2016 04:19:34 -0000 Subject: [Pytest-commit] Issue #357: Tox within pyenv's conda in a vagrant VM (hpk42/tox) Message-ID: <20160809041934.5831.83467@celery-worker-102.ash1.bb-inf.net> New issue 357: Tox within pyenv's conda in a vagrant VM https://bitbucket.org/hpk42/tox/issues/357/tox-within-pyenvs-conda-in-a-vagrant-vm Daniel Nunes: I'm using a Vagrant-managed VirtualBox VM where I have miniconda within pyenv. I'd love to use tox but apparently it's not working. I really need to use the conda environment for PyQt5 and lxml, is there any way to make it work? The [error I'm getting](http://i.imgur.com/xyQ4945.png). My[ tox.ini](http://pastebin.com/euvTRd4h). From issues-reply at bitbucket.org Mon Aug 15 14:24:09 2016 From: issues-reply at bitbucket.org (stub42) Date: Mon, 15 Aug 2016 18:24:09 -0000 Subject: [Pytest-commit] Issue #358: Explodes with python3-lxc Ubuntu package installed (hpk42/tox) Message-ID: <20160815182409.22356.20328@celery-worker-102.ash1.bb-inf.net> New issue 358: Explodes with python3-lxc Ubuntu package installed https://bitbucket.org/hpk42/tox/issues/358/explodes-with-python3-lxc-ubuntu-package stub42: If sitepackages=True and the python3-lxc Ubuntu package is installed, tox fails with a lengthy and unhelpful traceback. Something about how this package installs the lxc or _lxc Python packages is causing things to fail during freeze. ``` #!python test create: /home/ubuntu/charms/layers/telegraf/.tox/test test installdeps: -r/home/ubuntu/charms/layers/telegraf/test_requirements.txt ERROR: invocation failed (exit code 2), logfile: /home/ubuntu/charms/layers/telegraf/.tox/test/log/test-2.log ERROR: actionid: test msg: envreport cmdargs: ['/home/ubuntu/charms/layers/telegraf/.tox/test/bin/pip', 'freeze'] env: {...} Exception: Traceback (most recent call last): File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/packaging/requirements.py", line 92, in __init__ req = REQUIREMENT.parseString(requirement_string) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1172, in parseString raise exc File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1162, in parseString loc, tokens = self._parse( instring, 0 ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1028, in _parseNoCache loc,tokens = self.parseImpl( instring, preloc, doActions ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 2462, in parseImpl loc, exprtokens = e._parse( instring, loc, doActions ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1028, in _parseNoCache loc,tokens = self.parseImpl( instring, preloc, doActions ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 2719, in parseImpl return self.expr._parse( instring, loc, doActions, callPreParse=False ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1028, in _parseNoCache loc,tokens = self.parseImpl( instring, preloc, doActions ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 2445, in parseImpl loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1032, in _parseNoCache loc,tokens = self.parseImpl( instring, preloc, doActions ) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pyparsing.py", line 1823, in parseImpl raise ParseException(instring, loc, self.errmsg, self) pip._vendor.pyparsing.ParseException: Expected W:(abcd...) (at char 0), (line:1, col:1) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2788, in __init__ super(Requirement, self).__init__(requirement_string) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/packaging/requirements.py", line 96, in __init__ requirement_string[e.loc:e.loc + 8])) pip._vendor.packaging.requirements.InvalidRequirement: Invalid requirement, parse error at "'-lxc==0.'" During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/basecommand.py", line 215, in main status = self.run(options, args) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/commands/freeze.py", line 85, in run for line in freeze(**freeze_kwargs): File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/operations/freeze.py", line 47, in freeze dependency_links File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/__init__.py", line 264, in from_dist req = dist.as_requirement() File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2562, in as_requirement return Requirement.parse(spec) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2833, in parse req, = parse_requirements(s) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2781, in parse_requirements yield Requirement(line) File "/home/ubuntu/charms/layers/telegraf/.tox/test/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2790, in __init__ raise RequirementParseError(str(e)) pip._vendor.pkg_resources.RequirementParseError: Invalid requirement, parse error at "'-lxc==0.'" Traceback (most recent call last): File "/usr/bin/tox", line 9, in load_entry_point('tox==2.3.1', 'console_scripts', 'tox')() File "/usr/lib/python3/dist-packages/tox/session.py", line 39, in main retcode = Session(config).runcommand() File "/usr/lib/python3/dist-packages/tox/session.py", line 375, in runcommand return self.subcommand_test() File "/usr/lib/python3/dist-packages/tox/session.py", line 540, in subcommand_test action=action) File "/usr/lib/python3/dist-packages/tox/venv.py", line 362, in _pcall redirect=redirect, ignore_ret=ignore_ret) File "/usr/lib/python3/dist-packages/tox/session.py", line 193, in popen "%s (see %s)" % (invoked, outpath), ret) tox.InvocationError: InvocationError: /home/ubuntu/charms/layers/telegraf/.tox/test/bin/pip freeze (see /home/ubuntu/charms/layers/telegraf/.tox/test/log/test-2.log) ``` From issues-reply at bitbucket.org Tue Aug 16 07:27:03 2016 From: issues-reply at bitbucket.org (Cosimo Lupo) Date: Tue, 16 Aug 2016 11:27:03 -0000 Subject: [Pytest-commit] Issue #359: RuntimeError: Cannot locate a COMSPEC environment variable... with os.popen on Windows (hpk42/tox) Message-ID: <20160816112703.10684.11231@celery-worker-101.ash1.bb-inf.net> New issue 359: RuntimeError: Cannot locate a COMSPEC environment variable... with os.popen on Windows https://bitbucket.org/hpk42/tox/issues/359/runtimeerror-cannot-locate-a-comspec Cosimo Lupo: The distutils cygwinccompiler.py uses `os.popen`, which seems to require the %COMSPEC% environment variable to be set, else it raises a runtime error (see traceback below). If I use `passenv = COMSPEC` in my tox.ini, then it works fine. The value of the variable on my system is the default `C:\Windows\system32\cmd.exe`. Thanks, Cosimo ``` py27 runtests: commands[2] | python setup.py test running pytest running egg_info writing top-level names to src/python\compreffor.egg-info\top_level.txt writing dependency_links to src/python\compreffor.egg-info\dependency_links.txt writing src/python\compreffor.egg-info\PKG-INFO reading manifest file 'src/python\compreffor.egg-info\SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'src/python\compreffor.egg-info\SOURCES.txt' running build_ext Traceback (most recent call last): File "setup.py", line 168, in setup(**setup_params) File "C:\Python27-mingwpy\Lib\distutils\core.py", line 151, in setup dist.run_commands() File "C:\Python27-mingwpy\Lib\distutils\dist.py", line 953, in run_commands self.run_command(cmd) File "C:\Python27-mingwpy\Lib\distutils\dist.py", line 972, in run_command cmd_obj.run() File "build\bdist.win32\egg\ptr.py", line 85, in run File "C:\UsersLocal\cosimo.lupo\Documents\GitHub\compreffor\.tox\py27\lib\site-packages\setuptools\command\test.py", line 111, in with_project_on_sys_path with self.project_on_sys_path(): File "C:\Python27-mingwpy\Lib\contextlib.py", line 17, in __enter__ return self.gen.next() File "C:\UsersLocal\cosimo.lupo\Documents\GitHub\compreffor\.tox\py27\lib\site-packages\setuptools\command\test.py", line 139, in project_on_sys_path self.run_command('build_ext') File "C:\Python27-mingwpy\Lib\distutils\cmd.py", line 326, in run_command self.distribution.run_command(command) File "C:\Python27-mingwpy\Lib\distutils\dist.py", line 972, in run_command cmd_obj.run() File "C:\UsersLocal\cosimo.lupo\Documents\GitHub\compreffor\.tox\py27\lib\site-packages\setuptools\command\build_ext.py", line 68, in run _build_ext.run(self) File "C:\Python27-mingwpy\Lib\distutils\command\build_ext.py", line 306, in run force=self.force) File "C:\Python27-mingwpy\Lib\distutils\ccompiler.py", line 1004, in new_compiler return klass(None, dry_run, force) File "C:\Python27-mingwpy\Lib\distutils\cygwinccompiler.py", line 306, in __init__ CygwinCCompiler.__init__ (self, verbose, dry_run, force) File "C:\Python27-mingwpy\Lib\distutils\cygwinccompiler.py", line 107, in __init__ get_versions() File "C:\Python27-mingwpy\Lib\distutils\cygwinccompiler.py", line 420, in get_versions out = os.popen(gcc_exe + ' -dumpversion','r') RuntimeError: Cannot locate a COMSPEC environment variable to use as the shell ERROR: InvocationError: 'C:\\UsersLocal\\cosimo.lupo\\Documents\\GitHub\\compreffor\\.tox\\py27\\Scripts\\python.EXE setup.py test' ``` From issues-reply at bitbucket.org Tue Aug 23 20:40:37 2016 From: issues-reply at bitbucket.org (Jason R. Coombs) Date: Wed, 24 Aug 2016 00:40:37 -0000 Subject: [Pytest-commit] Issue #360: Error - no module named virtualenv (hpk42/tox) Message-ID: <20160824004037.25050.11069@celery-worker-101.ash1.bb-inf.net> New issue 360: Error - no module named virtualenv https://bitbucket.org/hpk42/tox/issues/360/error-no-module-named-virtualenv Jason R. Coombs: When using the [advertised setuptools integration](https://testrun.org/tox/latest/example/basic.html#integration-with-setuptools-distribute-test-commands) on a clean operating system that doesn't already have virtualenv installed, the tox run will fail when it attempts to invoke virtualenv: ``` py35 create: /vagrant/Dropbox/code/public/cherrypy/.tox/py35 ERROR: invocation failed (exit code 1), logfile: /vagrant/Dropbox/code/public/cherrypy/.tox/py35/log/py35-0.log ERROR: actionid: py35 msg: getenv cmdargs: ['/usr/bin/python3', '-m', 'virtualenv', '--python', '/usr/bin/python3.5', 'py35'] env: {'TERM': 'xterm-256color', 'HOME': '/home/vagrant', 'SHLVL': '1', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv =01;35:* .webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:', 'MAIL': '/var/mail/vagrant', 'LOGNAME': 'vagrant', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'USER': 'vagrant', 'PWD': '/vagrant/p/cherrypy', 'SSH_CLIENT': '10.0.2.2 65337 22', 'LANG': 'en_US', 'SSH_CONNECTION': '10.0.2.2 65337 10.0.2.15 22', 'PYTHONHASHSEED': '2586869941', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'XDG_SESSION_ID': '9', '_': '/usr/bin/python3', 'SSH_TTY': '/dev/pts/0', 'PLAT': 'linux-x86_64', 'VIRTUAL_ENV': '/vagrant/Dropbox/code/public/cherrypy/.tox/py35', 'LANGUAGE': 'en_US:' , 'PATH' : '/vagrant/Dropbox/code/public/cherrypy/.tox/py35/bin:/home/vagrant/bin:/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games', 'OLDPWD': '/home/vagrant', 'XDG_RUNTIME_DIR': '/run/user/900', 'SHELL': '/bin/bash'} /usr/bin/python3: No module named virtualenv ERROR: InvocationError: /usr/bin/python3 -m virtualenv --python /usr/bin/python3.5 py35 (see /vagrant/Dropbox/code/public/cherrypy/.tox/py35/log/py35-0.log) ``` I think the issue is obvious - tox is launching a subprocess to invoke virtualenv, but since virtualenv was loaded dynamically by the setuptools distutils command `test`, the subprocess doesn't have that library. I've worked around this issue in the past (when using pytest-runner to test libraries whose test suite would launch subprocesses) by adding all of the items in `sys.path` to the environment variable PYTHONPATH when launching the subprocess. I think there are a few options to address this issue. - Tox could rely on pyvenv on supported Python 3 versions, eliminating the dependency on virtualenv in those environments. - Tox could launch virtualenv in-process rather than as a subprocess. - Setuptools could implement the PYTHONPATH technique for all `test` commands, avoiding these issues in the general case. - Tox could implement the PYTHONPATH technique when launching virtualenv. - Tox could explicitly ensure that virtualenv will be on the path in the subprocess (knowing that it could have been resolved by the `test` command. - Tox could drop support for the distutils-bootstrapped technique, possibly preferring [rwt](https://pypi.org/project/rwt) as an alternate one-line bootstrapper for tox (though rwt itself currently requires bootstrapping). There may be other options as well. I've listed these approaches in order by my preference. What are the thoughts and preferences of the tox maintainers?