1313from test .support import socket_helper
1414from test .support import captured_stderr
1515from test .support .os_helper import TESTFN , EnvironmentVarGuard
16+ from test .support .script_helper import spawn_python , kill_python
1617import ast
1718import builtins
1819import glob
@@ -808,23 +809,24 @@ def test_underpth_dll_file(self):
808809
809810class CommandLineTests (unittest .TestCase ):
810811 def exists (self , path ):
811- if path is not None and os .path .isdir (path ):
812- return "exists"
813- else :
814- return "doesn't exist"
812+ if path is not None and os .path .isdir (path ):
813+ return "exists"
814+ else :
815+ return "doesn't exist"
815816
816817 def get_excepted_output (self , * args ):
817818 if len (args ) == 0 :
818819 user_base = site .getuserbase ()
819820 user_site = site .getusersitepackages ()
820- output = "sys.path = [\n "
821+ output = io .StringIO ()
822+ output .write ("sys.path = [\n " )
821823 for dir in sys .path :
822- output += " %r,\n " % (dir ,)
823- output += "]\n "
824- output += f"USER_BASE: { user_base !r } ({ self .exists (user_base )} )\n "
825- output += f"USER_SITE: { user_site !r } ({ self .exists (user_site )} )\n "
826- output += f"ENABLE_USER_SITE: { site .ENABLE_USER_SITE !r } \n "
827- return 0 , dedent (output ).strip ()
824+ output . write ( " %r,\n " % (dir ,) )
825+ output . write ( "]\n " )
826+ output . write ( f"USER_BASE: { user_base } ({ self .exists (user_base )} )\n " )
827+ output . write ( f"USER_SITE: { user_site } ({ self .exists (user_site )} )\n " )
828+ output . write ( f"ENABLE_USER_SITE: { site .ENABLE_USER_SITE } \n " )
829+ return 0 , dedent (output . getvalue () ).strip ()
828830
829831 buffer = []
830832 if '--user-base' in args :
@@ -846,25 +848,19 @@ def get_excepted_output(self, *args):
846848 return 10 , None
847849
848850 def invoke_command_line (self , * args ):
849- args = [sys .executable , "-m" , "site" , * args ]
850- env = os .environ .copy ()
851- env ["PYTHONUTF8" ] = "1"
852- env ["PYTHONIOENCODING" ] = "utf-8"
853-
854- proc = subprocess .Popen (args ,
855- stdout = subprocess .PIPE ,
856- stderr = subprocess .STDOUT ,
857- text = True ,
858- env = env ,
859- encoding = 'utf-8' ,
860- errors = 'replace' )
861- proc .wait ()
862- output = proc .stdout .read ()
851+ args = ["-m" , "site" , * args ]
852+
853+ with EnvironmentVarGuard () as env :
854+ env ["PYTHONUTF8" ] = "1"
855+ env ["PYTHONIOENCODING" ] = "utf-8"
856+ proc = spawn_python (* args , text = True , env = env ,
857+ encoding = 'utf-8' , errors = 'replace' )
858+
859+ output = kill_python (proc )
863860 return_code = proc .returncode
864- proc .stdout .close ()
865861 return return_code , os .path .normpath (dedent (output ).strip ())
866862
867- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
863+ @support . requires_subprocess ( )
868864 def test_no_args (self ):
869865 return_code , output = self .invoke_command_line ()
870866 excepted_return_code , _ = self .get_excepted_output ()
@@ -880,30 +876,30 @@ def test_no_args(self):
880876 self .assertEqual (lines [- 2 ], excepted_site )
881877 self .assertEqual (lines [- 1 ], f"ENABLE_USER_SITE: { site .ENABLE_USER_SITE } " )
882878
883- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
879+ @support . requires_subprocess ( )
884880 def test_unknown_args (self ):
885881 return_code , output = self .invoke_command_line ("--unknown-arg" )
886882 excepted_return_code , _ = self .get_excepted_output ("--unknown-arg" )
887883 self .assertEqual (return_code , excepted_return_code )
888884 self .assertIn ('[--user-base] [--user-site]' , output )
889885
890- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
886+ @support . requires_subprocess ( )
891887 def test_base_arg (self ):
892888 return_code , output = self .invoke_command_line ("--user-base" )
893889 excepted = self .get_excepted_output ("--user-base" )
894890 excepted_return_code , excepted_output = excepted
895891 self .assertEqual (return_code , excepted_return_code )
896892 self .assertEqual (output , excepted_output )
897893
898- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
894+ @support . requires_subprocess ( )
899895 def test_site_arg (self ):
900896 return_code , output = self .invoke_command_line ("--user-site" )
901897 excepted = self .get_excepted_output ("--user-site" )
902898 excepted_return_code , excepted_output = excepted
903899 self .assertEqual (return_code , excepted_return_code )
904900 self .assertEqual (output , excepted_output )
905901
906- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
902+ @support . requires_subprocess ( )
907903 def test_both_args (self ):
908904 return_code , output = self .invoke_command_line ("--user-base" ,
909905 "--user-site" )
0 commit comments