tox: Shell commands fail on Windows due to popen shell=False in Action._popen
- Bitbucket: https://bitbucket.org/hpk42/tox/issue/257
- Originally reported by: @stefano-m
- Originally created at: 2015-06-16T17:33:31.977
Hello,
I am using tox 2.0.2 and Python 2.7 on Windows 7.
As part of my tox tests, I need to run gulp and other npm-related commands.
To do so, I first run npm install and then e.g. run gulp that has been installed in the node_modules directory.
The relevant part of my tox.ini looks like
[testenv]
whitelist_externals = npm
commands =
npm install
{toxinidir}/node_modules/.bin/gulp
When I run tox, I get the following error when gulp is run:
py27-win32 runtests: commands[0] | npm install
py27-win32 runtests: commands[1] | F:\my_project\my_project/node_modules/.bin/gulp
ERROR: invocation failed (errno 8), args: ['F:\\my_project\\my_project/node_modules/.bin/gulp'], cwd: F:\my_project\my_project
Traceback (most recent call last):
File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\Python27\lib\runpy.py", line 72, in _run_code
exec code in run_globals
File "C:\Python27\Scripts\tox.exe\__main__.py", line 9, in <module>
File "C:\Python27\lib\site-packages\tox\session.py", line 39, in main
retcode = Session(config).runcommand()
File "C:\Python27\lib\site-packages\tox\session.py", line 367, in runcommand
return self.subcommand_test()
File "C:\Python27\lib\site-packages\tox\session.py", line 540, in subcommand_test
self.runtestenv(venv)
File "C:\Python27\lib\site-packages\tox\session.py", line 548, in runtestenv
venv.test(redirect=redirect)
File "C:\Python27\lib\site-packages\tox\venv.py", line 360, in test
ignore_ret=ignore_ret)
File "C:\Python27\lib\site-packages\tox\venv.py", line 384, in _pcall
return action.popen(args, cwd=cwd, env=env, redirect=redirect, ignore_ret=ignore_ret)
File "C:\Python27\lib\site-packages\tox\session.py", line 130, in popen
stdout=stdout, stderr=STDOUT)
File "C:\Python27\lib\site-packages\tox\session.py", line 218, in _popen
stdout=stdout, stderr=stderr, env=env)
File "C:\Python27\lib\subprocess.py", line 710, in __init__
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 958, in _execute_child
startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application
The same configuration works OK on Linux.
I think that the problem lies in Action._popen in the session.py module, where self.session.popen is called (line 216).
popen is run with the shell keyword argument set to False, and causes the command to fall over on Windows.
Since I had already noticed that problem (on Windows only) in other places where I use subprocess, I tried to change the value to True by doing
return self.session.popen(args, shell=(sys.platform == 'win32'), cwd=str(cwd),
universal_newlines=True,
stdout=stdout, stderr=stderr, env=env)
and that solved the issue (while keeping the default value to False on non-Windows platforms).
About this issue
- Original URL
- State: closed
- Created 8 years ago
- Comments: 17 (1 by maintainers)
@obestwalter thanks for your comment. I agree with you on this and think that it’s better to leave the code as is.