13
13
from test .support import socket_helper
14
14
from test .support import captured_stderr
15
15
from test .support .os_helper import TESTFN , EnvironmentVarGuard
16
+ from test .support .script_helper import spawn_python , kill_python
16
17
import ast
17
18
import builtins
18
19
import glob
@@ -808,23 +809,24 @@ def test_underpth_dll_file(self):
808
809
809
810
class CommandLineTests (unittest .TestCase ):
810
811
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"
815
816
816
817
def get_excepted_output (self , * args ):
817
818
if len (args ) == 0 :
818
819
user_base = site .getuserbase ()
819
820
user_site = site .getusersitepackages ()
820
- output = "sys.path = [\n "
821
+ output = io .StringIO ()
822
+ output .write ("sys.path = [\n " )
821
823
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 ()
828
830
829
831
buffer = []
830
832
if '--user-base' in args :
@@ -846,25 +848,19 @@ def get_excepted_output(self, *args):
846
848
return 10 , None
847
849
848
850
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 )
863
860
return_code = proc .returncode
864
- proc .stdout .close ()
865
861
return return_code , os .path .normpath (dedent (output ).strip ())
866
862
867
- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
863
+ @support . requires_subprocess ( )
868
864
def test_no_args (self ):
869
865
return_code , output = self .invoke_command_line ()
870
866
excepted_return_code , _ = self .get_excepted_output ()
@@ -880,30 +876,30 @@ def test_no_args(self):
880
876
self .assertEqual (lines [- 2 ], excepted_site )
881
877
self .assertEqual (lines [- 1 ], f"ENABLE_USER_SITE: { site .ENABLE_USER_SITE } " )
882
878
883
- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
879
+ @support . requires_subprocess ( )
884
880
def test_unknown_args (self ):
885
881
return_code , output = self .invoke_command_line ("--unknown-arg" )
886
882
excepted_return_code , _ = self .get_excepted_output ("--unknown-arg" )
887
883
self .assertEqual (return_code , excepted_return_code )
888
884
self .assertIn ('[--user-base] [--user-site]' , output )
889
885
890
- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
886
+ @support . requires_subprocess ( )
891
887
def test_base_arg (self ):
892
888
return_code , output = self .invoke_command_line ("--user-base" )
893
889
excepted = self .get_excepted_output ("--user-base" )
894
890
excepted_return_code , excepted_output = excepted
895
891
self .assertEqual (return_code , excepted_return_code )
896
892
self .assertEqual (output , excepted_output )
897
893
898
- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
894
+ @support . requires_subprocess ( )
899
895
def test_site_arg (self ):
900
896
return_code , output = self .invoke_command_line ("--user-site" )
901
897
excepted = self .get_excepted_output ("--user-site" )
902
898
excepted_return_code , excepted_output = excepted
903
899
self .assertEqual (return_code , excepted_return_code )
904
900
self .assertEqual (output , excepted_output )
905
901
906
- @unittest . skipIf ( sys . platform == 'wasi' , "Popen not supported on WASI" )
902
+ @support . requires_subprocess ( )
907
903
def test_both_args (self ):
908
904
return_code , output = self .invoke_command_line ("--user-base" ,
909
905
"--user-site" )
0 commit comments