Index: Lib/compileall.py =================================================================== --- Lib/compileall.py (revision 80615) +++ Lib/compileall.py (working copy) @@ -91,13 +91,14 @@ else: cfile = imp.cache_from_source(fullname) cache_dir = os.path.dirname(cfile) - try: - os.mkdir(cache_dir) - except OSError as error: - if error.errno != errno.EEXIST: - raise head, tail = name[:-3], name[-3:] if tail == '.py': + if not legacy: + try: + os.mkdir(cache_dir) + except OSError as error: + if error.errno != errno.EEXIST: + raise if not force: try: mtime = int(os.stat(fullname).st_mtime) Index: Lib/test/test_compileall.py =================================================================== --- Lib/test/test_compileall.py (revision 80615) +++ Lib/test/test_compileall.py (working copy) @@ -75,6 +75,18 @@ os.unlink(self.bc_path) os.unlink(self.bc_path2) + def test_no_pycache_in_non_package(self): + # Bug 8563 reported that __pycache__ directories got created by + # compile_file() for non-.py files. + data_dir = os.path.join(self.directory, 'data') + data_file = os.path.join(data_dir, 'file') + os.mkdir(data_dir) + # touch data/file + with open(data_file, 'w'): + pass + compileall.compile_file(data_file) + self.assertFalse(os.path.exists(os.path.join(data_dir, '__pycache__'))) + class EncodingTest(unittest.TestCase): """Issue 6716: compileall should escape source code when printing errors @@ -98,6 +110,7 @@ finally: sys.stdout = orig_stdout + class CommandLineTests(unittest.TestCase): """Test some aspects of compileall's CLI."""