diff --git a/Lib/py_compile.py b/Lib/py_compile.py --- a/Lib/py_compile.py +++ b/Lib/py_compile.py @@ -130,7 +130,7 @@ def compile(file, cfile=None, dfile=None else: cfile = imp.cache_from_source(file) try: - os.makedirs(os.path.dirname(cfile)) + os.makedirs(os.path.abspath(os.path.dirname(cfile))) except OSError as error: if error.errno != errno.EEXIST: raise diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_py_compile.py @@ -0,0 +1,51 @@ +import imp +import os +import py_compile +import shutil +import tempfile +import unittest + +from test import support, script_helper + +class PyCompileTests(unittest.TestCase): + + def setUp(self): + self.directory = tempfile.mkdtemp() + self.source_path = os.path.join(self.directory, '_test.py') + self.pyc_path = self.source_path + 'c' + self.cache_path = imp.cache_from_source(self.source_path) + with open(self.source_path, 'w') as file: + file.write('x = 123\n') + + def tearDown(self): + shutil.rmtree(self.directory) + + def test_absolute_path(self): + py_compile.compile(self.source_path, self.pyc_path) + self.assertTrue(os.path.exists(self.pyc_path)) + self.assertFalse(os.path.exists(self.cache_path)) + + def test_cache_path(self): + py_compile.compile(self.source_path) + self.assertTrue(os.path.exists(self.cache_path)) + + def test_cwd(self): + cwd = os.getcwd() + os.chdir(self.directory) + py_compile.compile(os.path.basename(self.source_path), + os.path.basename(self.pyc_path)) + os.chdir(cwd) + self.assertTrue(os.path.exists(self.pyc_path)) + self.assertFalse(os.path.exists(self.cache_path)) + + def test_relative_path(self): + py_compile.compile(os.path.relpath(self.source_path), + os.path.relpath(self.pyc_path)) + self.assertTrue(os.path.exists(self.pyc_path)) + self.assertFalse(os.path.exists(self.cache_path)) + +def test_main(): + support.run_unittest(PyCompileTests) + +if __name__ == "__main__": + test_main()