[3.6] bpo-29723: Consistently configure sys.path[0] (#636) · python/cpython@c609484

@@ -572,6 +572,73 @@ def test_syntaxerror_indented_caret_position(self):

572572

self.assertNotIn("\f", text)

573573

self.assertIn("\n 1 + 1 = 2\n ^", text)

574574575+

def test_consistent_sys_path_for_direct_execution(self):

576+

# This test case ensures that the following all give the same

577+

# sys.path configuration:

578+

#

579+

# ./python -s script_dir/__main__.py

580+

# ./python -s script_dir

581+

# ./python -I script_dir

582+

script = textwrap.dedent("""\

583+

import sys

584+

for entry in sys.path:

585+

print(entry)

586+

""")

587+

# Always show full path diffs on errors

588+

self.maxDiff = None

589+

with support.temp_dir() as work_dir, support.temp_dir() as script_dir:

590+

script_name = _make_test_script(script_dir, '__main__', script)

591+

# Reference output comes from directly executing __main__.py

592+

# We omit PYTHONPATH and user site to align with isolated mode

593+

p = spawn_python("-Es", script_name, cwd=work_dir)

594+

out_by_name = kill_python(p).decode().splitlines()

595+

self.assertEqual(out_by_name[0], script_dir)

596+

self.assertNotIn(work_dir, out_by_name)

597+

# Directory execution should give the same output

598+

p = spawn_python("-Es", script_dir, cwd=work_dir)

599+

out_by_dir = kill_python(p).decode().splitlines()

600+

self.assertEqual(out_by_dir, out_by_name)

601+

# As should directory execution in isolated mode

602+

p = spawn_python("-I", script_dir, cwd=work_dir)

603+

out_by_dir_isolated = kill_python(p).decode().splitlines()

604+

self.assertEqual(out_by_dir_isolated, out_by_dir, out_by_name)

605+606+

def test_consistent_sys_path_for_module_execution(self):

607+

# This test case ensures that the following both give the same

608+

# sys.path configuration:

609+

# ./python -sm script_pkg.__main__

610+

# ./python -sm script_pkg

611+

#

612+

# And that this fails as unable to find the package:

613+

# ./python -Im script_pkg

614+

script = textwrap.dedent("""\

615+

import sys

616+

for entry in sys.path:

617+

print(entry)

618+

""")

619+

# Always show full path diffs on errors

620+

self.maxDiff = None

621+

with support.temp_dir() as work_dir:

622+

script_dir = os.path.join(work_dir, "script_pkg")

623+

os.mkdir(script_dir)

624+

script_name = _make_test_script(script_dir, '__main__', script)

625+

# Reference output comes from `-m script_pkg.__main__`

626+

# We omit PYTHONPATH and user site to better align with the

627+

# direct execution test cases

628+

p = spawn_python("-sm", "script_pkg.__main__", cwd=work_dir)

629+

out_by_module = kill_python(p).decode().splitlines()

630+

self.assertEqual(out_by_module[0], '')

631+

self.assertNotIn(script_dir, out_by_module)

632+

# Package execution should give the same output

633+

p = spawn_python("-sm", "script_pkg", cwd=work_dir)

634+

out_by_package = kill_python(p).decode().splitlines()

635+

self.assertEqual(out_by_package, out_by_module)

636+

# Isolated mode should fail with an import error

637+

exitcode, stdout, stderr = assert_python_failure(

638+

"-Im", "script_pkg", cwd=work_dir

639+

)

640+

traceback_lines = stderr.decode().splitlines()

641+

self.assertIn("No module named script_pkg", traceback_lines[-1])

575642576643

def test_main():

577644

support.run_unittest(CmdLineTest)