Workaround bad interaction with .pth files. (#16238)

When setuptools installs a python module (as is done via python setup.py
install)  It puts the module into a subdirectory of site-packages and
then creates an entry in easy-install.pth to load that directory.  This
makes it difficult for Ansiballz to function correctly as the .pth file
overrides the sys.path that the wrapper constructs.  Using
sitecustomize.py fixes this because sitecustomize overrides the
directories handled in .pth files.

Fixes #16187
pull/16252/head
Toshio Kuratomi 9 years ago committed by GitHub
parent 7aca70b4b0
commit 94dc4554db

@ -270,18 +270,33 @@ if __name__ == '__main__':
# remote_tmpdir and this module executing under async. So we cannot # remote_tmpdir and this module executing under async. So we cannot
# store this in remote_tmpdir (use system tempdir instead) # store this in remote_tmpdir (use system tempdir instead)
temp_path = tempfile.mkdtemp(prefix='ansible_') temp_path = tempfile.mkdtemp(prefix='ansible_')
zipped_mod = os.path.join(temp_path, 'ansible_modlib.zip') zipped_mod = os.path.join(temp_path, 'ansible_modlib.zip')
modlib = open(zipped_mod, 'wb') modlib = open(zipped_mod, 'wb')
modlib.write(base64.b64decode(ZIPDATA)) modlib.write(base64.b64decode(ZIPDATA))
modlib.close() modlib.close()
if len(sys.argv) == 2: if len(sys.argv) == 2:
exitcode = debug(sys.argv[1], zipped_mod, ZIPLOADER_PARAMS) exitcode = debug(sys.argv[1], zipped_mod, ZIPLOADER_PARAMS)
else: else:
z = zipfile.ZipFile(zipped_mod) z = zipfile.ZipFile(zipped_mod, mode='r')
module = os.path.join(temp_path, 'ansible_module_%(ansible_module)s.py') module = os.path.join(temp_path, 'ansible_module_%(ansible_module)s.py')
f = open(module, 'wb') f = open(module, 'wb')
f.write(z.read('ansible_module_%(ansible_module)s.py')) f.write(z.read('ansible_module_%(ansible_module)s.py'))
f.close() f.close()
# When installed via setuptools (including python setup.py install),
# ansible may be installed with an easy-install.pth file. That file
# may load the system-wide install of ansible rather than the one in
# the module. sitecustomize is the only way to override that setting.
z = zipfile.ZipFile(zipped_mod, mode='a')
# py3: zipped_mod will be text, py2: it's bytes. Need bytes at the end
z = zipfile.ZipFile(zipped_mod, mode='a')
sitecustomize = u'import sys\\nsys.path.insert(0,"%%s")\\n' %% zipped_mod
sitecustomize = sitecustomize.encode('utf-8')
z.writestr('sitecustomize.py', sitecustomize)
z.close()
exitcode = invoke_module(module, zipped_mod, ZIPLOADER_PARAMS) exitcode = invoke_module(module, zipped_mod, ZIPLOADER_PARAMS)
finally: finally:
try: try:

Loading…
Cancel
Save