diff --git a/ipykernel/compiler.py b/ipykernel/compiler.py index 0b1384021..95770e7be 100644 --- a/ipykernel/compiler.py +++ b/ipykernel/compiler.py @@ -1,6 +1,7 @@ from IPython.core.compilerop import CachingCompiler import tempfile import os +import sys def murmur2_x86(data, seed): @@ -36,11 +37,35 @@ def murmur2_x86(data, seed): return h +convert_to_long_pathname = lambda filename:filename + +if sys.platform == 'win32': + try: + import ctypes + from ctypes.wintypes import MAX_PATH, LPCWSTR, LPWSTR, DWORD + + _GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW + _GetLongPathName.argtypes = [LPCWSTR, LPWSTR, DWORD] + _GetLongPathName.restype = DWORD + + def _convert_to_long_pathname(filename): + buf = ctypes.create_unicode_buffer(MAX_PATH) + rv = _GetLongPathName(filename, buf, MAX_PATH) + if rv != 0 and rv <= MAX_PATH: + filename = buf.value + return filename + + # test that it works so if there are any issues we fail just once here + _convert_to_long_pathname(__file__) + except: + pass + else: + convert_to_long_pathname = _convert_to_long_pathname def get_tmp_directory(): - tmp_dir = tempfile.gettempdir() + tmp_dir = convert_to_long_pathname(tempfile.gettempdir()) pid = os.getpid() - return tmp_dir + '/ipykernel_' + str(pid) + return tmp_dir + os.sep + 'ipykernel_' + str(pid) def get_tmp_hash_seed(): @@ -52,7 +77,7 @@ def get_file_name(code): cell_name = os.environ.get("IPYKERNEL_CELL_NAME") if cell_name is None: name = murmur2_x86(code, get_tmp_hash_seed()) - cell_name = get_tmp_directory() + '/' + str(name) + '.py' + cell_name = get_tmp_directory() + os.sep + str(name) + '.py' return cell_name diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index 62c6a5407..d1ce0ff8f 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -507,7 +507,7 @@ async def debugInfo(self, message): 'isStarted': self.is_started, 'hashMethod': 'Murmur2', 'hashSeed': get_tmp_hash_seed(), - 'tmpFilePrefix': get_tmp_directory() + '/', + 'tmpFilePrefix': get_tmp_directory() + os.sep, 'tmpFileSuffix': '.py', 'breakpoints': breakpoint_list, 'stoppedThreads': self.stopped_threads, diff --git a/ipykernel/tests/test_debugger.py b/ipykernel/tests/test_debugger.py index ab9f13a2c..65f5711e1 100644 --- a/ipykernel/tests/test_debugger.py +++ b/ipykernel/tests/test_debugger.py @@ -271,3 +271,9 @@ def test_rich_inspect_at_breakpoint(kernel_with_debug): ) assert reply["body"]["data"] == {"text/plain": locals_[0]["value"]} + + +def test_convert_to_long_pathname(): + if sys.platform == 'win32': + from ipykernel.compiler import _convert_to_long_pathname + _convert_to_long_pathname(__file__) \ No newline at end of file