@@ -87,31 +87,11 @@ def _make_test_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
87
87
importlib .invalidate_caches ()
88
88
return to_return
89
89
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
-
110
90
class CmdLineTest (unittest .TestCase ):
111
91
def _check_output (self , script_name , exit_code , data ,
112
92
expected_file , expected_argv0 ,
113
93
expected_path0 , expected_package ,
114
- expected_loader ):
94
+ expected_loader , expected_cwd = None ):
115
95
if verbose > 1 :
116
96
print ("Output from test script %r:" % script_name )
117
97
print (repr (data ))
@@ -121,7 +101,9 @@ def _check_output(self, script_name, exit_code, data,
121
101
printed_package = '__package__==%r' % expected_package
122
102
printed_argv0 = 'sys.argv[0]==%a' % expected_argv0
123
103
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
125
107
if verbose > 1 :
126
108
print ('Expected output:' )
127
109
print (printed_file )
@@ -135,23 +117,35 @@ def _check_output(self, script_name, exit_code, data,
135
117
self .assertIn (printed_path0 .encode ('utf-8' ), data )
136
118
self .assertIn (printed_cwd .encode ('utf-8' ), data )
137
119
138
- def _check_script (self , script_name , expected_file ,
120
+ def _check_script (self , script_exec_args , expected_file ,
139
121
expected_argv0 , expected_path0 ,
140
122
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 ]
142
126
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 ,
146
134
expected_argv0 , expected_path0 ,
147
- expected_package , expected_loader )
135
+ expected_package , expected_loader , cwd )
148
136
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
+ )
153
147
if verbose > 1 :
154
- print ('Output from test script %r:' % script_name )
148
+ print ('Output from test script %r:' % script_exec_args )
155
149
print (repr (err ))
156
150
print ('Expected output: %r' % expected_msg )
157
151
self .assertIn (expected_msg .encode ('utf-8' ), err )
@@ -287,35 +281,35 @@ def test_module_in_package(self):
287
281
pkg_dir = os .path .join (script_dir , 'test_pkg' )
288
282
make_pkg (pkg_dir )
289
283
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 ,
292
285
script_dir , 'test_pkg' ,
293
- importlib .machinery .SourceFileLoader )
286
+ importlib .machinery .SourceFileLoader ,
287
+ cwd = script_dir )
294
288
295
289
def test_module_in_package_in_zipfile (self ):
296
290
with support .temp_dir () as script_dir :
297
291
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 )
301
295
302
296
def test_module_in_subpackage_in_zipfile (self ):
303
297
with support .temp_dir () as script_dir :
304
298
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 )
309
303
310
304
def test_package (self ):
311
305
with support .temp_dir () as script_dir :
312
306
pkg_dir = os .path .join (script_dir , 'test_pkg' )
313
307
make_pkg (pkg_dir )
314
308
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 ,
317
310
script_name , script_dir , 'test_pkg' ,
318
- importlib .machinery .SourceFileLoader )
311
+ importlib .machinery .SourceFileLoader ,
312
+ cwd = script_dir )
319
313
320
314
def test_package_compiled (self ):
321
315
with support .temp_dir () as script_dir :
@@ -325,19 +319,18 @@ def test_package_compiled(self):
325
319
compiled_name = py_compile .compile (script_name , doraise = True )
326
320
os .remove (script_name )
327
321
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 ,
330
323
pyc_file , script_dir , 'test_pkg' ,
331
- importlib .machinery .SourcelessFileLoader )
324
+ importlib .machinery .SourcelessFileLoader ,
325
+ cwd = script_dir )
332
326
333
327
def test_package_error (self ):
334
328
with support .temp_dir () as script_dir :
335
329
pkg_dir = os .path .join (script_dir , 'test_pkg' )
336
330
make_pkg (pkg_dir )
337
331
msg = ("'test_pkg' is a package and cannot "
338
332
"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 )
341
334
342
335
def test_package_recursion (self ):
343
336
with support .temp_dir () as script_dir :
@@ -348,8 +341,7 @@ def test_package_recursion(self):
348
341
msg = ("Cannot use package as __main__ module; "
349
342
"'test_pkg' is a package and cannot "
350
343
"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 )
353
345
354
346
def test_issue8202 (self ):
355
347
# Make sure package __init__ modules see "-m" in sys.argv0 while
@@ -365,7 +357,7 @@ def test_issue8202(self):
365
357
expected = "init_argv0==%r" % '-m'
366
358
self .assertIn (expected .encode ('utf-8' ), out )
367
359
self ._check_output (script_name , rc , out ,
368
- script_name , script_name , '' , 'test_pkg' ,
360
+ script_name , script_name , script_dir , 'test_pkg' ,
369
361
importlib .machinery .SourceFileLoader )
370
362
371
363
def test_issue8202_dash_c_file_ignored (self ):
@@ -394,7 +386,7 @@ def test_issue8202_dash_m_file_ignored(self):
394
386
rc , out , err = assert_python_ok ('-m' , 'other' , * example_args ,
395
387
__isolated = False )
396
388
self ._check_output (script_name , rc , out ,
397
- script_name , script_name , '' , '' ,
389
+ script_name , script_name , script_dir , '' ,
398
390
importlib .machinery .SourceFileLoader )
399
391
400
392
@contextlib .contextmanager
@@ -627,7 +619,7 @@ def test_consistent_sys_path_for_module_execution(self):
627
619
# direct execution test cases
628
620
p = spawn_python ("-sm" , "script_pkg.__main__" , cwd = work_dir )
629
621
out_by_module = kill_python (p ).decode ().splitlines ()
630
- self .assertEqual (out_by_module [0 ], '' )
622
+ self .assertEqual (out_by_module [0 ], work_dir )
631
623
self .assertNotIn (script_dir , out_by_module )
632
624
# Package execution should give the same output
633
625
p = spawn_python ("-sm" , "script_pkg" , cwd = work_dir )
0 commit comments