64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
|
#!/usr/bin/env python
|
||
|
"""Provides an entry point for python scripts and python modules on the controller with the current python interpreter and optional code coverage collection."""
|
||
|
|
||
|
import imp
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def main():
|
||
|
"""Main entry point."""
|
||
|
name = os.path.basename(__file__)
|
||
|
args = [sys.executable]
|
||
|
|
||
|
coverage_config = os.environ.get('_ANSIBLE_COVERAGE_CONFIG')
|
||
|
coverage_output = os.environ.get('_ANSIBLE_COVERAGE_OUTPUT')
|
||
|
|
||
|
if coverage_config:
|
||
|
if coverage_output:
|
||
|
args += ['-m', 'coverage.__main__', 'run', '--rcfile', coverage_config]
|
||
|
else:
|
||
|
try:
|
||
|
imp.find_module('coverage')
|
||
|
except ImportError:
|
||
|
exit('ERROR: Could not find `coverage` module. Did you use a virtualenv created without --system-site-packages or with the wrong interpreter?')
|
||
|
|
||
|
if name == 'python.py':
|
||
|
if sys.argv[1] == '-c':
|
||
|
# prevent simple misuse of python.py with -c which does not work with coverage
|
||
|
sys.exit('ERROR: Use `python -c` instead of `python.py -c` to avoid errors when code coverage is collected.')
|
||
|
elif name == 'pytest':
|
||
|
args += ['-m', 'pytest']
|
||
|
else:
|
||
|
args += [find_executable(name)]
|
||
|
|
||
|
args += sys.argv[1:]
|
||
|
|
||
|
os.execv(args[0], args)
|
||
|
|
||
|
|
||
|
def find_executable(name):
|
||
|
"""
|
||
|
:type name: str
|
||
|
:rtype: str
|
||
|
"""
|
||
|
path = os.environ.get('PATH', os.path.defpath)
|
||
|
seen = set([os.path.abspath(__file__)])
|
||
|
|
||
|
for base in path.split(os.path.pathsep):
|
||
|
candidate = os.path.abspath(os.path.join(base, name))
|
||
|
|
||
|
if candidate in seen:
|
||
|
continue
|
||
|
|
||
|
seen.add(candidate)
|
||
|
|
||
|
if os.path.exists(candidate) and os.access(candidate, os.F_OK | os.X_OK):
|
||
|
return candidate
|
||
|
|
||
|
raise Exception('Executable "%s" not found in path: %s' % (name, path))
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|