bpo-33053: -m now adds starting directory to sys.path (GH-6231) · python/cpython@d5d9e02 (original) (raw)

`@@ -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)

`