@@ -87,31 +87,11 @@ def _make_test_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
8787 importlib .invalidate_caches ()
8888 return to_return
8989
90- # There's no easy way to pass the script directory in to get
91- # -m to work (avoiding that is the whole point of making
92- # directories and zipfiles executable!)
93- # So we fake it for testing purposes with a custom launch script
94- launch_source = """\
95- import sys, os.path, runpy
96- sys.path.insert(0, %s)
97- runpy._run_module_as_main(%r)
98- """
99-
100- def _make_launch_script (script_dir , script_basename , module_name , path = None ):
101- if path is None :
102- path = "os.path.dirname(__file__)"
103- else :
104- path = repr (path )
105- source = launch_source % (path , module_name )
106- to_return = make_script (script_dir , script_basename , source )
107- importlib .invalidate_caches ()
108- return to_return
109-
11090class CmdLineTest (unittest .TestCase ):
11191 def _check_output (self , script_name , exit_code , data ,
11292 expected_file , expected_argv0 ,
11393 expected_path0 , expected_package ,
114- expected_loader ):
94+ expected_loader , expected_cwd = None ):
11595 if verbose > 1 :
11696 print ("Output from test script %r:" % script_name )
11797 print (repr (data ))
@@ -121,7 +101,9 @@ def _check_output(self, script_name, exit_code, data,
121101 printed_package = '__package__==%r' % expected_package
122102 printed_argv0 = 'sys.argv[0]==%a' % expected_argv0
123103 printed_path0 = 'sys.path[0]==%a' % expected_path0
124- printed_cwd = 'cwd==%a' % os .getcwd ()
104+ if expected_cwd is None :
105+ expected_cwd = os .getcwd ()
106+ printed_cwd = 'cwd==%a' % expected_cwd
125107 if verbose > 1 :
126108 print ('Expected output:' )
127109 print (printed_file )
@@ -135,23 +117,35 @@ def _check_output(self, script_name, exit_code, data,
135117 self .assertIn (printed_path0 .encode ('utf-8' ), data )
136118 self .assertIn (printed_cwd .encode ('utf-8' ), data )
137119
138- def _check_script (self , script_name , expected_file ,
120+ def _check_script (self , script_exec_args , expected_file ,
139121 expected_argv0 , expected_path0 ,
140122 expected_package , expected_loader ,
141- * cmd_line_switches ):
123+ * cmd_line_switches , cwd = None , ** env_vars ):
124+ if isinstance (script_exec_args , str ):
125+ script_exec_args = [script_exec_args ]
142126 run_args = [* support .optim_args_from_interpreter_flags (),
143- * cmd_line_switches , script_name , * example_args ]
144- rc , out , err = assert_python_ok (* run_args , __isolated = False )
145- self ._check_output (script_name , rc , out + err , expected_file ,
127+ * cmd_line_switches , * script_exec_args , * example_args ]
128+ if env_vars :
129+ print (env_vars )
130+ rc , out , err = assert_python_ok (
131+ * run_args , __isolated = False , __cwd = cwd , ** env_vars
132+ )
133+ self ._check_output (script_exec_args , rc , out + err , expected_file ,
146134 expected_argv0 , expected_path0 ,
147- expected_package , expected_loader )
135+ expected_package , expected_loader , cwd )
148136
149- def _check_import_error (self , script_name , expected_msg ,
150- * cmd_line_switches ):
151- run_args = cmd_line_switches + (script_name ,)
152- rc , out , err = assert_python_failure (* run_args )
137+ def _check_import_error (self , script_exec_args , expected_msg ,
138+ * cmd_line_switches , cwd = None , ** env_vars ):
139+ if isinstance (script_exec_args , str ):
140+ script_exec_args = (script_exec_args ,)
141+ else :
142+ script_exec_args = tuple (script_exec_args )
143+ run_args = cmd_line_switches + script_exec_args
144+ rc , out , err = assert_python_failure (
145+ * run_args , __isolated = False , __cwd = cwd , ** env_vars
146+ )
153147 if verbose > 1 :
154- print ('Output from test script %r:' % script_name )
148+ print ('Output from test script %r:' % script_exec_args )
155149 print (repr (err ))
156150 print ('Expected output: %r' % expected_msg )
157151 self .assertIn (expected_msg .encode ('utf-8' ), err )
@@ -287,35 +281,35 @@ def test_module_in_package(self):
287281 pkg_dir = os .path .join (script_dir , 'test_pkg' )
288282 make_pkg (pkg_dir )
289283 script_name = _make_test_script (pkg_dir , 'script' )
290- launch_name = _make_launch_script (script_dir , 'launch' , 'test_pkg.script' )
291- self ._check_script (launch_name , script_name , script_name ,
284+ self ._check_script (["-m" , "test_pkg.script" ], script_name , script_name ,
292285 script_dir , 'test_pkg' ,
293- importlib .machinery .SourceFileLoader )
286+ importlib .machinery .SourceFileLoader ,
287+ cwd = script_dir )
294288
295289 def test_module_in_package_in_zipfile (self ):
296290 with support .temp_dir () as script_dir :
297291 zip_name , run_name = _make_test_zip_pkg (script_dir , 'test_zip' , 'test_pkg' , 'script' )
298- launch_name = _make_launch_script ( script_dir , 'launch' , ' test_pkg.script' , zip_name )
299- self . _check_script ( launch_name , run_name , run_name ,
300- zip_name , 'test_pkg' , zipimport . zipimporter )
292+ self . _check_script ([ "-m" , " test_pkg.script" ], run_name , run_name ,
293+ script_dir , 'test_pkg' , zipimport . zipimporter ,
294+ PYTHONPATH = zip_name , cwd = script_dir )
301295
302296 def test_module_in_subpackage_in_zipfile (self ):
303297 with support .temp_dir () as script_dir :
304298 zip_name , run_name = _make_test_zip_pkg (script_dir , 'test_zip' , 'test_pkg' , 'script' , depth = 2 )
305- launch_name = _make_launch_script ( script_dir , 'launch' , ' test_pkg.test_pkg.script' , zip_name )
306- self . _check_script ( launch_name , run_name , run_name ,
307- zip_name , 'test_pkg.test_pkg' ,
308- zipimport . zipimporter )
299+ self . _check_script ([ "-m" , " test_pkg.test_pkg.script" ], run_name , run_name ,
300+ script_dir , 'test_pkg.test_pkg' ,
301+ zipimport . zipimporter ,
302+ PYTHONPATH = zip_name , cwd = script_dir )
309303
310304 def test_package (self ):
311305 with support .temp_dir () as script_dir :
312306 pkg_dir = os .path .join (script_dir , 'test_pkg' )
313307 make_pkg (pkg_dir )
314308 script_name = _make_test_script (pkg_dir , '__main__' )
315- launch_name = _make_launch_script (script_dir , 'launch' , 'test_pkg' )
316- self ._check_script (launch_name , script_name ,
309+ self ._check_script (["-m" , "test_pkg" ], script_name ,
317310 script_name , script_dir , 'test_pkg' ,
318- importlib .machinery .SourceFileLoader )
311+ importlib .machinery .SourceFileLoader ,
312+ cwd = script_dir )
319313
320314 def test_package_compiled (self ):
321315 with support .temp_dir () as script_dir :
@@ -325,19 +319,18 @@ def test_package_compiled(self):
325319 compiled_name = py_compile .compile (script_name , doraise = True )
326320 os .remove (script_name )
327321 pyc_file = support .make_legacy_pyc (script_name )
328- launch_name = _make_launch_script (script_dir , 'launch' , 'test_pkg' )
329- self ._check_script (launch_name , pyc_file ,
322+ self ._check_script (["-m" , "test_pkg" ], pyc_file ,
330323 pyc_file , script_dir , 'test_pkg' ,
331- importlib .machinery .SourcelessFileLoader )
324+ importlib .machinery .SourcelessFileLoader ,
325+ cwd = script_dir )
332326
333327 def test_package_error (self ):
334328 with support .temp_dir () as script_dir :
335329 pkg_dir = os .path .join (script_dir , 'test_pkg' )
336330 make_pkg (pkg_dir )
337331 msg = ("'test_pkg' is a package and cannot "
338332 "be directly executed" )
339- launch_name = _make_launch_script (script_dir , 'launch' , 'test_pkg' )
340- self ._check_import_error (launch_name , msg )
333+ self ._check_import_error (["-m" , "test_pkg" ], msg , cwd = script_dir )
341334
342335 def test_package_recursion (self ):
343336 with support .temp_dir () as script_dir :
@@ -348,8 +341,7 @@ def test_package_recursion(self):
348341 msg = ("Cannot use package as __main__ module; "
349342 "'test_pkg' is a package and cannot "
350343 "be directly executed" )
351- launch_name = _make_launch_script (script_dir , 'launch' , 'test_pkg' )
352- self ._check_import_error (launch_name , msg )
344+ self ._check_import_error (["-m" , "test_pkg" ], msg , cwd = script_dir )
353345
354346 def test_issue8202 (self ):
355347 # Make sure package __init__ modules see "-m" in sys.argv0 while
@@ -365,7 +357,7 @@ def test_issue8202(self):
365357 expected = "init_argv0==%r" % '-m'
366358 self .assertIn (expected .encode ('utf-8' ), out )
367359 self ._check_output (script_name , rc , out ,
368- script_name , script_name , '' , 'test_pkg' ,
360+ script_name , script_name , script_dir , 'test_pkg' ,
369361 importlib .machinery .SourceFileLoader )
370362
371363 def test_issue8202_dash_c_file_ignored (self ):
@@ -394,7 +386,7 @@ def test_issue8202_dash_m_file_ignored(self):
394386 rc , out , err = assert_python_ok ('-m' , 'other' , * example_args ,
395387 __isolated = False )
396388 self ._check_output (script_name , rc , out ,
397- script_name , script_name , '' , '' ,
389+ script_name , script_name , script_dir , '' ,
398390 importlib .machinery .SourceFileLoader )
399391
400392 @contextlib .contextmanager
@@ -627,7 +619,7 @@ def test_consistent_sys_path_for_module_execution(self):
627619 # direct execution test cases
628620 p = spawn_python ("-sm" , "script_pkg.__main__" , cwd = work_dir )
629621 out_by_module = kill_python (p ).decode ().splitlines ()
630- self .assertEqual (out_by_module [0 ], '' )
622+ self .assertEqual (out_by_module [0 ], work_dir )
631623 self .assertNotIn (script_dir , out_by_module )
632624 # Package execution should give the same output
633625 p = spawn_python ("-sm" , "script_pkg" , cwd = work_dir )
0 commit comments