for line in lines:
self.assertRegex(line, rb"cannot import name 'Fraction' from 'fractions' \(.*\)")
+ @unittest.skipIf(sys.platform == 'win32', 'Cannot delete cwd on Windows')
+ def test_script_shadowing_stdlib_cwd_failure(self):
+ with os_helper.temp_dir() as tmp:
+ subtmp = os.path.join(tmp, "subtmp")
+ os.mkdir(subtmp)
+ with open(os.path.join(subtmp, "main.py"), "w", encoding='utf-8') as f:
+ f.write(f"""
+import sys
+assert sys.path[0] == ''
+
+import os
+import shutil
+shutil.rmtree(os.getcwd())
+
+os.does_not_exist
+""")
+ # Use -c to ensure sys.path[0] is ""
+ popen = script_helper.spawn_python("-c", "import main", cwd=subtmp)
+ stdout, stderr = popen.communicate()
+ expected_error = rb"AttributeError: module 'os' has no attribute 'does_not_exist'"
+ self.assertRegex(stdout, expected_error)
+
def test_script_shadowing_stdlib_sys_path_modification(self):
script_errors = [
(
if (sys_path_0[0] == L'\0') {
// if sys.path[0] == "", treat it as if it were the current directory
if (!_Py_wgetcwd(sys_path_0_buf, MAXPATHLEN)) {
- return -1;
+ // If we failed to getcwd, don't raise an exception and instead
+ // let the caller proceed assuming no shadowing
+ return 0;
}
sys_path_0 = sys_path_0_buf;
}