summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_cmd_line.py
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2018-06-16 04:40:56 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2018-06-16 04:40:56 (GMT)
commitb193fa996a746111252156f11fb14c12fd6267e6 (patch)
tree1995957ce580ba762a19f64e41db2db32aec096a /Lib/test/test_cmd_line.py
parent68680035143a3a6398faa88f067f244c74691d19 (diff)
downloadcpython-b193fa996a746111252156f11fb14c12fd6267e6.zip
cpython-b193fa996a746111252156f11fb14c12fd6267e6.tar.gz
cpython-b193fa996a746111252156f11fb14c12fd6267e6.tar.bz2
bpo-33499: Add PYTHONPYCACHEPREFIX env var for alt bytecode cache location. (GH-6834)
In some development setups it is inconvenient or impossible to write bytecode caches to the code tree, but the bytecode caches are still useful. The PYTHONPYCACHEPREFIX environment variable allows specifying an alternate location for cached bytecode files, within which a directory tree mirroring the code tree will be created. This cache tree is then used (for both reading and writing) instead of the local `__pycache__` subdirectory within each source directory. Exposed at runtime as sys.pycache_prefix (defaulting to None), and can be set from the CLI as "-X pycache_prefix=path". Patch by Carl Meyer.
Diffstat (limited to 'Lib/test/test_cmd_line.py')
-rw-r--r--Lib/test/test_cmd_line.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index d8a96c4..ce14a96 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -519,6 +519,32 @@ class CmdLineTest(unittest.TestCase):
with self.subTest(envar_value=value):
assert_python_ok('-c', code, **env_vars)
+ def test_set_pycache_prefix(self):
+ # sys.pycache_prefix can be set from either -X pycache_prefix or
+ # PYTHONPYCACHEPREFIX env var, with the former taking precedence.
+ NO_VALUE = object() # `-X pycache_prefix` with no `=PATH`
+ cases = [
+ # (PYTHONPYCACHEPREFIX, -X pycache_prefix, sys.pycache_prefix)
+ (None, None, None),
+ ('foo', None, 'foo'),
+ (None, 'bar', 'bar'),
+ ('foo', 'bar', 'bar'),
+ ('foo', '', None),
+ ('foo', NO_VALUE, None),
+ ]
+ for envval, opt, expected in cases:
+ exp_clause = "is None" if expected is None else f'== "{expected}"'
+ code = f"import sys; sys.exit(not sys.pycache_prefix {exp_clause})"
+ args = ['-c', code]
+ env = {} if envval is None else {'PYTHONPYCACHEPREFIX': envval}
+ if opt is NO_VALUE:
+ args[:0] = ['-X', 'pycache_prefix']
+ elif opt is not None:
+ args[:0] = ['-X', f'pycache_prefix={opt}']
+ with self.subTest(envval=envval, opt=opt):
+ with support.temp_cwd():
+ assert_python_ok(*args, **env)
+
def run_xdev(self, *args, check_exitcode=True, xdev=True):
env = dict(os.environ)
env.pop('PYTHONWARNINGS', None)