Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
2f54b98c
Kaydet (Commit)
2f54b98c
authored
Tem 14, 2012
tarafından
Nick Coghlan
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Sade Fark
Merge fix for #15230 from 3.2
üst
045bd534
761bb113
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
277 additions
and
158 deletions
+277
-158
runpy.py
Lib/runpy.py
+4
-2
test_runpy.py
Lib/test/test_runpy.py
+268
-156
NEWS
Misc/NEWS
+5
-0
No files found.
Lib/runpy.py
Dosyayı görüntüle @
2f54b98c
...
@@ -70,6 +70,7 @@ def _run_code(code, run_globals, init_globals=None,
...
@@ -70,6 +70,7 @@ def _run_code(code, run_globals, init_globals=None,
run_globals
.
update
(
__name__
=
mod_name
,
run_globals
.
update
(
__name__
=
mod_name
,
__file__
=
mod_fname
,
__file__
=
mod_fname
,
__cached__
=
None
,
__cached__
=
None
,
__doc__
=
None
,
__loader__
=
mod_loader
,
__loader__
=
mod_loader
,
__package__
=
pkg_name
)
__package__
=
pkg_name
)
exec
(
code
,
run_globals
)
exec
(
code
,
run_globals
)
...
@@ -233,12 +234,14 @@ def run_path(path_name, init_globals=None, run_name=None):
...
@@ -233,12 +234,14 @@ def run_path(path_name, init_globals=None, run_name=None):
"""
"""
if
run_name
is
None
:
if
run_name
is
None
:
run_name
=
"<run_path>"
run_name
=
"<run_path>"
pkg_name
=
run_name
.
rpartition
(
"."
)[
0
]
importer
=
_get_importer
(
path_name
)
importer
=
_get_importer
(
path_name
)
if
isinstance
(
importer
,
(
type
(
None
),
imp
.
NullImporter
)):
if
isinstance
(
importer
,
(
type
(
None
),
imp
.
NullImporter
)):
# Not a valid sys.path entry, so run the code directly
# Not a valid sys.path entry, so run the code directly
# execfile() doesn't help as we want to allow compiled files
# execfile() doesn't help as we want to allow compiled files
code
=
_get_code_from_file
(
path_name
)
code
=
_get_code_from_file
(
path_name
)
return
_run_module_code
(
code
,
init_globals
,
run_name
,
path_name
)
return
_run_module_code
(
code
,
init_globals
,
run_name
,
path_name
,
pkg_name
=
pkg_name
)
else
:
else
:
# Importer is defined for path, so add it to
# Importer is defined for path, so add it to
# the start of sys.path
# the start of sys.path
...
@@ -257,7 +260,6 @@ def run_path(path_name, init_globals=None, run_name=None):
...
@@ -257,7 +260,6 @@ def run_path(path_name, init_globals=None, run_name=None):
mod_name
,
loader
,
code
,
fname
=
_get_main_module_details
()
mod_name
,
loader
,
code
,
fname
=
_get_main_module_details
()
finally
:
finally
:
sys
.
modules
[
main_name
]
=
saved_main
sys
.
modules
[
main_name
]
=
saved_main
pkg_name
=
""
with
_TempModule
(
run_name
)
as
temp_module
,
\
with
_TempModule
(
run_name
)
as
temp_module
,
\
_ModifiedArgv0
(
path_name
):
_ModifiedArgv0
(
path_name
):
mod_globals
=
temp_module
.
module
.
__dict__
mod_globals
=
temp_module
.
module
.
__dict__
...
...
Lib/test/test_runpy.py
Dosyayı görüntüle @
2f54b98c
...
@@ -13,80 +13,143 @@ from test.support import (
...
@@ -13,80 +13,143 @@ from test.support import (
from
test.script_helper
import
(
from
test.script_helper
import
(
make_pkg
,
make_script
,
make_zip_pkg
,
make_zip_script
,
temp_dir
)
make_pkg
,
make_script
,
make_zip_pkg
,
make_zip_script
,
temp_dir
)
import
runpy
from
runpy
import
_run_code
,
_run_module_code
,
run_module
,
run_path
from
runpy
import
_run_code
,
_run_module_code
,
run_module
,
run_path
# Note: This module can't safely test _run_module_as_main as it
# Note: This module can't safely test _run_module_as_main as it
# runs its tests in the current process, which would mess with the
# runs its tests in the current process, which would mess with the
# real __main__ module (usually test.regrtest)
# real __main__ module (usually test.regrtest)
# See test_cmd_line_script for a test that executes that code path
# See test_cmd_line_script for a test that executes that code path
# Set up the test code and expected results
class
RunModuleCodeTest
(
unittest
.
TestCase
):
"""Unit tests for runpy._run_code and runpy._run_module_code"""
expected_result
=
[
"Top level assignment"
,
"Lower level reference"
]
# Set up the test code and expected results
test_source
=
(
example_source
=
"""
\
"# Check basic code execution
\n
"
# Check basic code execution
"result = ['Top level assignment']
\n
"
result = ['Top level assignment']
"def f():
\n
"
def f():
" result.append('Lower level reference')
\n
"
result.append('Lower level reference')
"f()
\n
"
f()
"# Check the sys module
\n
"
del f
"import sys
\n
"
# Check the sys module
"run_argv0 = sys.argv[0]
\n
"
import sys
"run_name_in_sys_modules = __name__ in sys.modules
\n
"
run_argv0 = sys.argv[0]
"if run_name_in_sys_modules:
\n
"
run_name_in_sys_modules = __name__ in sys.modules
" module_in_sys_modules = globals() is sys.modules[__name__].__dict__
\n
"
module_in_sys_modules = (run_name_in_sys_modules and
"# Check nested operation
\n
"
globals() is sys.modules[__name__].__dict__)
"import runpy
\n
"
# Check nested operation
"nested = runpy._run_module_code('x=1
\\
n', mod_name='<run>')
\n
"
import runpy
)
nested = runpy._run_module_code('x=1
\\
n', mod_name='<run>')
"""
def
test_run_code
(
self
):
implicit_namespace
=
{
"__name__"
:
None
,
"__file__"
:
None
,
"__cached__"
:
None
,
"__package__"
:
None
,
"__doc__"
:
None
,
}
example_namespace
=
{
"sys"
:
sys
,
"runpy"
:
runpy
,
"result"
:
[
"Top level assignment"
,
"Lower level reference"
],
"run_argv0"
:
sys
.
argv
[
0
],
"run_name_in_sys_modules"
:
False
,
"module_in_sys_modules"
:
False
,
"nested"
:
dict
(
implicit_namespace
,
x
=
1
,
__name__
=
"<run>"
,
__loader__
=
None
),
}
example_namespace
.
update
(
implicit_namespace
)
class
CodeExecutionMixin
:
# Issue #15230 (run_path not handling run_name correctly) highlighted a
# problem with the way arguments were being passed from higher level APIs
# down to lower level code. This mixin makes it easier to ensure full
# testing occurs at those upper layers as well, not just at the utility
# layer
def
assertNamespaceMatches
(
self
,
result_ns
,
expected_ns
):
"""Check two namespaces match.
Ignores any unspecified interpreter created names
"""
# Impls are permitted to add extra names, so filter them out
for
k
in
list
(
result_ns
):
if
k
.
startswith
(
"__"
)
and
k
.
endswith
(
"__"
):
if
k
not
in
expected_ns
:
result_ns
.
pop
(
k
)
if
k
not
in
expected_ns
[
"nested"
]:
result_ns
[
"nested"
]
.
pop
(
k
)
# Don't use direct dict comparison - the diffs are too hard to debug
self
.
assertEqual
(
set
(
result_ns
),
set
(
expected_ns
))
for
k
in
result_ns
:
actual
=
(
k
,
result_ns
[
k
])
expected
=
(
k
,
expected_ns
[
k
])
self
.
assertEqual
(
actual
,
expected
)
def
check_code_execution
(
self
,
create_namespace
,
expected_namespace
):
"""Check that an interface runs the example code correctly
First argument is a callable accepting the initial globals and
using them to create the actual namespace
Second argument is the expected result
"""
sentinel
=
object
()
expected_ns
=
expected_namespace
.
copy
()
run_name
=
expected_ns
[
"__name__"
]
saved_argv0
=
sys
.
argv
[
0
]
saved_argv0
=
sys
.
argv
[
0
]
d
=
_run_code
(
self
.
test_source
,
{})
saved_mod
=
sys
.
modules
.
get
(
run_name
,
sentinel
)
self
.
assertEqual
(
d
[
"result"
],
self
.
expected_result
)
# Check without initial globals
self
.
assertIs
(
d
[
"__name__"
],
None
)
result_ns
=
create_namespace
(
None
)
self
.
assertIs
(
d
[
"__file__"
],
None
)
self
.
assertNamespaceMatches
(
result_ns
,
expected_ns
)
self
.
assertIs
(
d
[
"__cached__"
],
None
)
self
.
assertIs
(
d
[
"__loader__"
],
None
)
self
.
assertIs
(
d
[
"__package__"
],
None
)
self
.
assertIs
(
d
[
"run_argv0"
],
saved_argv0
)
self
.
assertNotIn
(
"run_name"
,
d
)
self
.
assertIs
(
sys
.
argv
[
0
],
saved_argv0
)
self
.
assertIs
(
sys
.
argv
[
0
],
saved_argv0
)
self
.
assertIs
(
sys
.
modules
.
get
(
run_name
,
sentinel
),
saved_mod
)
def
test_run_module_code
(
self
):
# And then with initial globals
initial
=
object
()
initial_ns
=
{
"sentinel"
:
sentinel
}
name
=
"<Nonsense>"
expected_ns
[
"sentinel"
]
=
sentinel
file
=
"Some other nonsense"
result_ns
=
create_namespace
(
initial_ns
)
loader
=
"Now you're just being silly"
self
.
assertIsNot
(
result_ns
,
initial_ns
)
package
=
''
# Treat as a top level module
self
.
assertNamespaceMatches
(
result_ns
,
expected_ns
)
d1
=
dict
(
initial
=
initial
)
saved_argv0
=
sys
.
argv
[
0
]
d2
=
_run_module_code
(
self
.
test_source
,
d1
,
name
,
file
,
loader
,
package
)
self
.
assertNotIn
(
"result"
,
d1
)
self
.
assertIs
(
d2
[
"initial"
],
initial
)
self
.
assertEqual
(
d2
[
"result"
],
self
.
expected_result
)
self
.
assertEqual
(
d2
[
"nested"
][
"x"
],
1
)
self
.
assertIs
(
d2
[
"__name__"
],
name
)
self
.
assertTrue
(
d2
[
"run_name_in_sys_modules"
])
self
.
assertTrue
(
d2
[
"module_in_sys_modules"
])
self
.
assertIs
(
d2
[
"__file__"
],
file
)
self
.
assertIs
(
d2
[
"__cached__"
],
None
)
self
.
assertIs
(
d2
[
"run_argv0"
],
file
)
self
.
assertIs
(
d2
[
"__loader__"
],
loader
)
self
.
assertIs
(
d2
[
"__package__"
],
package
)
self
.
assertIs
(
sys
.
argv
[
0
],
saved_argv0
)
self
.
assertIs
(
sys
.
argv
[
0
],
saved_argv0
)
self
.
assertNotIn
(
name
,
sys
.
modules
)
self
.
assertIs
(
sys
.
modules
.
get
(
run_name
,
sentinel
),
saved_mod
)
class
ExecutionLayerTestCase
(
unittest
.
TestCase
,
CodeExecutionMixin
):
"""Unit tests for runpy._run_code and runpy._run_module_code"""
def
test_run_code
(
self
):
expected_ns
=
example_namespace
.
copy
()
expected_ns
.
update
({
"__loader__"
:
None
,
})
def
create_ns
(
init_globals
):
return
_run_code
(
example_source
,
{},
init_globals
)
self
.
check_code_execution
(
create_ns
,
expected_ns
)
class
RunModuleTest
(
unittest
.
TestCase
):
def
test_run_module_code
(
self
):
mod_name
=
"<Nonsense>"
mod_fname
=
"Some other nonsense"
mod_loader
=
"Now you're just being silly"
mod_package
=
''
# Treat as a top level module
expected_ns
=
example_namespace
.
copy
()
expected_ns
.
update
({
"__name__"
:
mod_name
,
"__file__"
:
mod_fname
,
"__loader__"
:
mod_loader
,
"__package__"
:
mod_package
,
"run_argv0"
:
mod_fname
,
"run_name_in_sys_modules"
:
True
,
"module_in_sys_modules"
:
True
,
})
def
create_ns
(
init_globals
):
return
_run_module_code
(
example_source
,
init_globals
,
mod_name
,
mod_fname
,
mod_loader
,
mod_package
)
self
.
check_code_execution
(
create_ns
,
expected_ns
)
class
RunModuleTestCase
(
unittest
.
TestCase
,
CodeExecutionMixin
):
"""Unit tests for runpy.run_module"""
"""Unit tests for runpy.run_module"""
def
expect_import_error
(
self
,
mod_name
):
def
expect_import_error
(
self
,
mod_name
):
...
@@ -110,7 +173,7 @@ class RunModuleTest(unittest.TestCase):
...
@@ -110,7 +173,7 @@ class RunModuleTest(unittest.TestCase):
self
.
expect_import_error
(
"multiprocessing"
)
self
.
expect_import_error
(
"multiprocessing"
)
def
test_library_module
(
self
):
def
test_library_module
(
self
):
run_module
(
"runpy"
)
self
.
assertEqual
(
run_module
(
"runpy"
)[
"__name__"
],
"runpy"
)
def
_add_pkg_dir
(
self
,
pkg_dir
):
def
_add_pkg_dir
(
self
,
pkg_dir
):
os
.
mkdir
(
pkg_dir
)
os
.
mkdir
(
pkg_dir
)
...
@@ -122,19 +185,19 @@ class RunModuleTest(unittest.TestCase):
...
@@ -122,19 +185,19 @@ class RunModuleTest(unittest.TestCase):
pkg_name
=
"__runpy_pkg__"
pkg_name
=
"__runpy_pkg__"
test_fname
=
mod_base
+
os
.
extsep
+
"py"
test_fname
=
mod_base
+
os
.
extsep
+
"py"
pkg_dir
=
sub_dir
=
tempfile
.
mkdtemp
()
pkg_dir
=
sub_dir
=
tempfile
.
mkdtemp
()
if
verbose
:
print
(
" Package tree in:"
,
sub_dir
)
if
verbose
>
1
:
print
(
" Package tree in:"
,
sub_dir
)
sys
.
path
.
insert
(
0
,
pkg_dir
)
sys
.
path
.
insert
(
0
,
pkg_dir
)
if
verbose
:
print
(
" Updated sys.path:"
,
sys
.
path
[
0
])
if
verbose
>
1
:
print
(
" Updated sys.path:"
,
sys
.
path
[
0
])
for
i
in
range
(
depth
):
for
i
in
range
(
depth
):
sub_dir
=
os
.
path
.
join
(
sub_dir
,
pkg_name
)
sub_dir
=
os
.
path
.
join
(
sub_dir
,
pkg_name
)
pkg_fname
=
self
.
_add_pkg_dir
(
sub_dir
)
pkg_fname
=
self
.
_add_pkg_dir
(
sub_dir
)
if
verbose
:
print
(
" Next level in:"
,
sub_dir
)
if
verbose
>
1
:
print
(
" Next level in:"
,
sub_dir
)
if
verbose
:
print
(
" Created:"
,
pkg_fname
)
if
verbose
>
1
:
print
(
" Created:"
,
pkg_fname
)
mod_fname
=
os
.
path
.
join
(
sub_dir
,
test_fname
)
mod_fname
=
os
.
path
.
join
(
sub_dir
,
test_fname
)
mod_file
=
open
(
mod_fname
,
"w"
)
mod_file
=
open
(
mod_fname
,
"w"
)
mod_file
.
write
(
source
)
mod_file
.
write
(
source
)
mod_file
.
close
()
mod_file
.
close
()
if
verbose
:
print
(
" Created:"
,
mod_fname
)
if
verbose
>
1
:
print
(
" Created:"
,
mod_fname
)
mod_name
=
(
pkg_name
+
"."
)
*
depth
+
mod_base
mod_name
=
(
pkg_name
+
"."
)
*
depth
+
mod_base
return
pkg_dir
,
mod_fname
,
mod_name
return
pkg_dir
,
mod_fname
,
mod_name
...
@@ -142,77 +205,102 @@ class RunModuleTest(unittest.TestCase):
...
@@ -142,77 +205,102 @@ class RunModuleTest(unittest.TestCase):
for
entry
in
list
(
sys
.
modules
):
for
entry
in
list
(
sys
.
modules
):
if
entry
.
startswith
(
"__runpy_pkg__"
):
if
entry
.
startswith
(
"__runpy_pkg__"
):
del
sys
.
modules
[
entry
]
del
sys
.
modules
[
entry
]
if
verbose
:
print
(
" Removed sys.modules entries"
)
if
verbose
>
1
:
print
(
" Removed sys.modules entries"
)
del
sys
.
path
[
0
]
del
sys
.
path
[
0
]
if
verbose
:
print
(
" Removed sys.path entry"
)
if
verbose
>
1
:
print
(
" Removed sys.path entry"
)
for
root
,
dirs
,
files
in
os
.
walk
(
top
,
topdown
=
False
):
for
root
,
dirs
,
files
in
os
.
walk
(
top
,
topdown
=
False
):
for
name
in
files
:
for
name
in
files
:
try
:
try
:
os
.
remove
(
os
.
path
.
join
(
root
,
name
))
os
.
remove
(
os
.
path
.
join
(
root
,
name
))
except
OSError
as
ex
:
except
OSError
as
ex
:
if
verbose
:
print
(
ex
)
# Persist with cleaning up
if
verbose
>
1
:
print
(
ex
)
# Persist with cleaning up
for
name
in
dirs
:
for
name
in
dirs
:
fullname
=
os
.
path
.
join
(
root
,
name
)
fullname
=
os
.
path
.
join
(
root
,
name
)
try
:
try
:
os
.
rmdir
(
fullname
)
os
.
rmdir
(
fullname
)
except
OSError
as
ex
:
except
OSError
as
ex
:
if
verbose
:
print
(
ex
)
# Persist with cleaning up
if
verbose
>
1
:
print
(
ex
)
# Persist with cleaning up
try
:
try
:
os
.
rmdir
(
top
)
os
.
rmdir
(
top
)
if
verbose
:
print
(
" Removed package tree"
)
if
verbose
>
1
:
print
(
" Removed package tree"
)
except
OSError
as
ex
:
except
OSError
as
ex
:
if
verbose
:
print
(
ex
)
# Persist with cleaning up
if
verbose
>
1
:
print
(
ex
)
# Persist with cleaning up
def
_fix_ns_for_legacy_pyc
(
self
,
ns
,
alter_sys
):
char_to_add
=
"c"
if
__debug__
else
"o"
ns
[
"__file__"
]
+=
char_to_add
if
alter_sys
:
ns
[
"run_argv0"
]
+=
char_to_add
def
_check_module
(
self
,
depth
):
def
_check_module
(
self
,
depth
,
alter_sys
=
False
):
pkg_dir
,
mod_fname
,
mod_name
=
(
pkg_dir
,
mod_fname
,
mod_name
=
(
self
.
_make_pkg
(
"x=1
\n
"
,
depth
))
self
.
_make_pkg
(
example_source
,
depth
))
forget
(
mod_name
)
forget
(
mod_name
)
expected_ns
=
example_namespace
.
copy
()
expected_ns
.
update
({
"__name__"
:
mod_name
,
"__file__"
:
mod_fname
,
"__package__"
:
mod_name
.
rpartition
(
"."
)[
0
],
})
if
alter_sys
:
expected_ns
.
update
({
"run_argv0"
:
mod_fname
,
"run_name_in_sys_modules"
:
True
,
"module_in_sys_modules"
:
True
,
})
def
create_ns
(
init_globals
):
return
run_module
(
mod_name
,
init_globals
,
alter_sys
=
alter_sys
)
try
:
try
:
if
verbose
:
print
(
"Running from source:"
,
mod_name
)
if
verbose
>
1
:
print
(
"Running from source:"
,
mod_name
)
d1
=
run_module
(
mod_name
)
# Read from source
self
.
check_code_execution
(
create_ns
,
expected_ns
)
self
.
assertIn
(
"x"
,
d1
)
self
.
assertEqual
(
d1
[
"x"
],
1
)
del
d1
# Ensure __loader__ entry doesn't keep file open
importlib
.
invalidate_caches
()
importlib
.
invalidate_caches
()
__import__
(
mod_name
)
__import__
(
mod_name
)
os
.
remove
(
mod_fname
)
os
.
remove
(
mod_fname
)
make_legacy_pyc
(
mod_fname
)
make_legacy_pyc
(
mod_fname
)
unload
(
mod_name
)
# In case loader caches paths
unload
(
mod_name
)
# In case loader caches paths
if
verbose
:
print
(
"Running from compiled:"
,
mod_name
)
importlib
.
invalidate_caches
()
importlib
.
invalidate_caches
()
d2
=
run_module
(
mod_name
)
# Read from bytecode
if
verbose
>
1
:
print
(
"Running from compiled:"
,
mod_name
)
self
.
assertIn
(
"x"
,
d2
)
self
.
_fix_ns_for_legacy_pyc
(
expected_ns
,
alter_sys
)
self
.
assertEqual
(
d2
[
"x"
],
1
)
self
.
check_code_execution
(
create_ns
,
expected_ns
)
del
d2
# Ensure __loader__ entry doesn't keep file open
finally
:
finally
:
self
.
_del_pkg
(
pkg_dir
,
depth
,
mod_name
)
self
.
_del_pkg
(
pkg_dir
,
depth
,
mod_name
)
if
verbose
:
print
(
"Module executed successfully"
)
if
verbose
>
1
:
print
(
"Module executed successfully"
)
def
_check_package
(
self
,
depth
):
def
_check_package
(
self
,
depth
,
alter_sys
=
False
):
pkg_dir
,
mod_fname
,
mod_name
=
(
pkg_dir
,
mod_fname
,
mod_name
=
(
self
.
_make_pkg
(
"x=1
\n
"
,
depth
,
"__main__"
))
self
.
_make_pkg
(
example_source
,
depth
,
"__main__"
))
pkg_name
,
_
,
_
=
mod_name
.
rpartition
(
"."
)
pkg_name
=
mod_name
.
rpartition
(
"."
)[
0
]
forget
(
mod_name
)
forget
(
mod_name
)
expected_ns
=
example_namespace
.
copy
()
expected_ns
.
update
({
"__name__"
:
mod_name
,
"__file__"
:
mod_fname
,
"__package__"
:
pkg_name
,
})
if
alter_sys
:
expected_ns
.
update
({
"run_argv0"
:
mod_fname
,
"run_name_in_sys_modules"
:
True
,
"module_in_sys_modules"
:
True
,
})
def
create_ns
(
init_globals
):
return
run_module
(
pkg_name
,
init_globals
,
alter_sys
=
alter_sys
)
try
:
try
:
if
verbose
:
print
(
"Running from source:"
,
pkg_name
)
if
verbose
>
1
:
print
(
"Running from source:"
,
pkg_name
)
d1
=
run_module
(
pkg_name
)
# Read from source
self
.
check_code_execution
(
create_ns
,
expected_ns
)
self
.
assertIn
(
"x"
,
d1
)
self
.
assertTrue
(
d1
[
"x"
]
==
1
)
del
d1
# Ensure __loader__ entry doesn't keep file open
importlib
.
invalidate_caches
()
importlib
.
invalidate_caches
()
__import__
(
mod_name
)
__import__
(
mod_name
)
os
.
remove
(
mod_fname
)
os
.
remove
(
mod_fname
)
make_legacy_pyc
(
mod_fname
)
make_legacy_pyc
(
mod_fname
)
unload
(
mod_name
)
# In case loader caches paths
unload
(
mod_name
)
# In case loader caches paths
if
verbose
:
print
(
"Running from compiled:"
,
pkg_name
)
if
verbose
>
1
:
print
(
"Running from compiled:"
,
pkg_name
)
importlib
.
invalidate_caches
()
importlib
.
invalidate_caches
()
d2
=
run_module
(
pkg_name
)
# Read from bytecode
self
.
_fix_ns_for_legacy_pyc
(
expected_ns
,
alter_sys
)
self
.
assertIn
(
"x"
,
d2
)
self
.
check_code_execution
(
create_ns
,
expected_ns
)
self
.
assertTrue
(
d2
[
"x"
]
==
1
)
del
d2
# Ensure __loader__ entry doesn't keep file open
finally
:
finally
:
self
.
_del_pkg
(
pkg_dir
,
depth
,
pkg_name
)
self
.
_del_pkg
(
pkg_dir
,
depth
,
pkg_name
)
if
verbose
:
print
(
"Package executed successfully"
)
if
verbose
>
1
:
print
(
"Package executed successfully"
)
def
_add_relative_modules
(
self
,
base_dir
,
source
,
depth
):
def
_add_relative_modules
(
self
,
base_dir
,
source
,
depth
):
if
depth
<=
1
:
if
depth
<=
1
:
...
@@ -225,17 +313,17 @@ class RunModuleTest(unittest.TestCase):
...
@@ -225,17 +313,17 @@ class RunModuleTest(unittest.TestCase):
# Add sibling module
# Add sibling module
sibling_fname
=
os
.
path
.
join
(
module_dir
,
"sibling.py"
)
sibling_fname
=
os
.
path
.
join
(
module_dir
,
"sibling.py"
)
create_empty_file
(
sibling_fname
)
create_empty_file
(
sibling_fname
)
if
verbose
:
print
(
" Added sibling module:"
,
sibling_fname
)
if
verbose
>
1
:
print
(
" Added sibling module:"
,
sibling_fname
)
# Add nephew module
# Add nephew module
uncle_dir
=
os
.
path
.
join
(
parent_dir
,
"uncle"
)
uncle_dir
=
os
.
path
.
join
(
parent_dir
,
"uncle"
)
self
.
_add_pkg_dir
(
uncle_dir
)
self
.
_add_pkg_dir
(
uncle_dir
)
if
verbose
:
print
(
" Added uncle package:"
,
uncle_dir
)
if
verbose
>
1
:
print
(
" Added uncle package:"
,
uncle_dir
)
cousin_dir
=
os
.
path
.
join
(
uncle_dir
,
"cousin"
)
cousin_dir
=
os
.
path
.
join
(
uncle_dir
,
"cousin"
)
self
.
_add_pkg_dir
(
cousin_dir
)
self
.
_add_pkg_dir
(
cousin_dir
)
if
verbose
:
print
(
" Added cousin package:"
,
cousin_dir
)
if
verbose
>
1
:
print
(
" Added cousin package:"
,
cousin_dir
)
nephew_fname
=
os
.
path
.
join
(
cousin_dir
,
"nephew.py"
)
nephew_fname
=
os
.
path
.
join
(
cousin_dir
,
"nephew.py"
)
create_empty_file
(
nephew_fname
)
create_empty_file
(
nephew_fname
)
if
verbose
:
print
(
" Added nephew module:"
,
nephew_fname
)
if
verbose
>
1
:
print
(
" Added nephew module:"
,
nephew_fname
)
def
_check_relative_imports
(
self
,
depth
,
run_name
=
None
):
def
_check_relative_imports
(
self
,
depth
,
run_name
=
None
):
contents
=
r"""
\
contents
=
r"""
\
...
@@ -245,13 +333,17 @@ from ..uncle.cousin import nephew
...
@@ -245,13 +333,17 @@ from ..uncle.cousin import nephew
"""
"""
pkg_dir
,
mod_fname
,
mod_name
=
(
pkg_dir
,
mod_fname
,
mod_name
=
(
self
.
_make_pkg
(
contents
,
depth
))
self
.
_make_pkg
(
contents
,
depth
))
if
run_name
is
None
:
expected_name
=
mod_name
else
:
expected_name
=
run_name
try
:
try
:
self
.
_add_relative_modules
(
pkg_dir
,
contents
,
depth
)
self
.
_add_relative_modules
(
pkg_dir
,
contents
,
depth
)
pkg_name
=
mod_name
.
rpartition
(
'.'
)[
0
]
pkg_name
=
mod_name
.
rpartition
(
'.'
)[
0
]
if
verbose
:
print
(
"Running from source:"
,
mod_name
)
if
verbose
>
1
:
print
(
"Running from source:"
,
mod_name
)
d1
=
run_module
(
mod_name
,
run_name
=
run_name
)
# Read from source
d1
=
run_module
(
mod_name
,
run_name
=
run_name
)
# Read from source
self
.
assert
In
(
"__package__"
,
d1
)
self
.
assert
Equal
(
d1
[
"__name__"
],
expected_name
)
self
.
assert
True
(
d1
[
"__package__"
]
==
pkg_name
)
self
.
assert
Equal
(
d1
[
"__package__"
],
pkg_name
)
self
.
assertIn
(
"sibling"
,
d1
)
self
.
assertIn
(
"sibling"
,
d1
)
self
.
assertIn
(
"nephew"
,
d1
)
self
.
assertIn
(
"nephew"
,
d1
)
del
d1
# Ensure __loader__ entry doesn't keep file open
del
d1
# Ensure __loader__ entry doesn't keep file open
...
@@ -260,78 +352,98 @@ from ..uncle.cousin import nephew
...
@@ -260,78 +352,98 @@ from ..uncle.cousin import nephew
os
.
remove
(
mod_fname
)
os
.
remove
(
mod_fname
)
make_legacy_pyc
(
mod_fname
)
make_legacy_pyc
(
mod_fname
)
unload
(
mod_name
)
# In case the loader caches paths
unload
(
mod_name
)
# In case the loader caches paths
if
verbose
:
print
(
"Running from compiled:"
,
mod_name
)
if
verbose
>
1
:
print
(
"Running from compiled:"
,
mod_name
)
importlib
.
invalidate_caches
()
importlib
.
invalidate_caches
()
d2
=
run_module
(
mod_name
,
run_name
=
run_name
)
# Read from bytecode
d2
=
run_module
(
mod_name
,
run_name
=
run_name
)
# Read from bytecode
self
.
assert
In
(
"__package__"
,
d2
)
self
.
assert
Equal
(
d2
[
"__name__"
],
expected_name
)
self
.
assert
True
(
d2
[
"__package__"
]
==
pkg_name
)
self
.
assert
Equal
(
d2
[
"__package__"
],
pkg_name
)
self
.
assertIn
(
"sibling"
,
d2
)
self
.
assertIn
(
"sibling"
,
d2
)
self
.
assertIn
(
"nephew"
,
d2
)
self
.
assertIn
(
"nephew"
,
d2
)
del
d2
# Ensure __loader__ entry doesn't keep file open
del
d2
# Ensure __loader__ entry doesn't keep file open
finally
:
finally
:
self
.
_del_pkg
(
pkg_dir
,
depth
,
mod_name
)
self
.
_del_pkg
(
pkg_dir
,
depth
,
mod_name
)
if
verbose
:
print
(
"Module executed successfully"
)
if
verbose
>
1
:
print
(
"Module executed successfully"
)
def
test_run_module
(
self
):
def
test_run_module
(
self
):
for
depth
in
range
(
4
):
for
depth
in
range
(
4
):
if
verbose
:
print
(
"Testing package depth:"
,
depth
)
if
verbose
>
1
:
print
(
"Testing package depth:"
,
depth
)
self
.
_check_module
(
depth
)
self
.
_check_module
(
depth
)
def
test_run_package
(
self
):
def
test_run_package
(
self
):
for
depth
in
range
(
1
,
4
):
for
depth
in
range
(
1
,
4
):
if
verbose
:
print
(
"Testing package depth:"
,
depth
)
if
verbose
>
1
:
print
(
"Testing package depth:"
,
depth
)
self
.
_check_package
(
depth
)
self
.
_check_package
(
depth
)
def
test_run_module_alter_sys
(
self
):
for
depth
in
range
(
4
):
if
verbose
>
1
:
print
(
"Testing package depth:"
,
depth
)
self
.
_check_module
(
depth
,
alter_sys
=
True
)
def
test_run_package_alter_sys
(
self
):
for
depth
in
range
(
1
,
4
):
if
verbose
>
1
:
print
(
"Testing package depth:"
,
depth
)
self
.
_check_package
(
depth
,
alter_sys
=
True
)
def
test_explicit_relative_import
(
self
):
def
test_explicit_relative_import
(
self
):
for
depth
in
range
(
2
,
5
):
for
depth
in
range
(
2
,
5
):
if
verbose
:
print
(
"Testing relative imports at depth:"
,
depth
)
if
verbose
>
1
:
print
(
"Testing relative imports at depth:"
,
depth
)
self
.
_check_relative_imports
(
depth
)
self
.
_check_relative_imports
(
depth
)
def
test_main_relative_import
(
self
):
def
test_main_relative_import
(
self
):
for
depth
in
range
(
2
,
5
):
for
depth
in
range
(
2
,
5
):
if
verbose
:
print
(
"Testing main relative imports at depth:"
,
depth
)
if
verbose
>
1
:
print
(
"Testing main relative imports at depth:"
,
depth
)
self
.
_check_relative_imports
(
depth
,
"__main__"
)
self
.
_check_relative_imports
(
depth
,
"__main__"
)
def
test_run_name
(
self
):
depth
=
1
run_name
=
"And now for something completely different"
pkg_dir
,
mod_fname
,
mod_name
=
(
self
.
_make_pkg
(
example_source
,
depth
))
forget
(
mod_name
)
expected_ns
=
example_namespace
.
copy
()
expected_ns
.
update
({
"__name__"
:
run_name
,
"__file__"
:
mod_fname
,
"__package__"
:
mod_name
.
rpartition
(
"."
)[
0
],
})
def
create_ns
(
init_globals
):
return
run_module
(
mod_name
,
init_globals
,
run_name
)
try
:
self
.
check_code_execution
(
create_ns
,
expected_ns
)
finally
:
self
.
_del_pkg
(
pkg_dir
,
depth
,
mod_name
)
class
RunPathTest
(
unittest
.
TestCase
):
class
RunPathTest
Case
(
unittest
.
TestCase
,
CodeExecutionMixin
):
"""Unit tests for runpy.run_path"""
"""Unit tests for runpy.run_path"""
# Based on corresponding tests in test_cmd_line_script
test_source
=
"""
\
# Script may be run with optimisation enabled, so don't rely on assert
# statements being executed
def assertEqual(lhs, rhs):
if lhs != rhs:
raise AssertionError('
%
r !=
%
r'
%
(lhs, rhs))
def assertIs(lhs, rhs):
if lhs is not rhs:
raise AssertionError('
%
r is not
%
r'
%
(lhs, rhs))
# Check basic code execution
result = ['Top level assignment']
def f():
result.append('Lower level reference')
f()
assertEqual(result, ['Top level assignment', 'Lower level reference'])
# Check the sys module
import sys
assertIs(globals(), sys.modules[__name__].__dict__)
argv0 = sys.argv[0]
"""
def
_make_test_script
(
self
,
script_dir
,
script_basename
,
source
=
None
):
def
_make_test_script
(
self
,
script_dir
,
script_basename
,
source
=
None
):
if
source
is
None
:
if
source
is
None
:
source
=
self
.
test
_source
source
=
example
_source
return
make_script
(
script_dir
,
script_basename
,
source
)
return
make_script
(
script_dir
,
script_basename
,
source
)
def
_check_script
(
self
,
script_name
,
expected_name
,
expected_file
,
def
_check_script
(
self
,
script_name
,
expected_name
,
expected_file
,
expected_argv0
,
expected_package
):
expected_argv0
):
result
=
run_path
(
script_name
)
# First check is without run_name
self
.
assertEqual
(
result
[
"__name__"
],
expected_name
)
def
create_ns
(
init_globals
):
self
.
assertEqual
(
result
[
"__file__"
],
expected_file
)
return
run_path
(
script_name
,
init_globals
)
self
.
assertEqual
(
result
[
"__cached__"
],
None
)
expected_ns
=
example_namespace
.
copy
()
self
.
assertIn
(
"argv0"
,
result
)
expected_ns
.
update
({
self
.
assertEqual
(
result
[
"argv0"
],
expected_argv0
)
"__name__"
:
expected_name
,
self
.
assertEqual
(
result
[
"__package__"
],
expected_package
)
"__file__"
:
expected_file
,
"__package__"
:
""
,
"run_argv0"
:
expected_argv0
,
"run_name_in_sys_modules"
:
True
,
"module_in_sys_modules"
:
True
,
})
self
.
check_code_execution
(
create_ns
,
expected_ns
)
# Second check makes sure run_name works in all cases
run_name
=
"prove.issue15230.is.fixed"
def
create_ns
(
init_globals
):
return
run_path
(
script_name
,
init_globals
,
run_name
)
expected_ns
[
"__name__"
]
=
run_name
expected_ns
[
"__package__"
]
=
run_name
.
rpartition
(
"."
)[
0
]
self
.
check_code_execution
(
create_ns
,
expected_ns
)
def
_check_import_error
(
self
,
script_name
,
msg
):
def
_check_import_error
(
self
,
script_name
,
msg
):
msg
=
re
.
escape
(
msg
)
msg
=
re
.
escape
(
msg
)
...
@@ -342,7 +454,7 @@ argv0 = sys.argv[0]
...
@@ -342,7 +454,7 @@ argv0 = sys.argv[0]
mod_name
=
'script'
mod_name
=
'script'
script_name
=
self
.
_make_test_script
(
script_dir
,
mod_name
)
script_name
=
self
.
_make_test_script
(
script_dir
,
mod_name
)
self
.
_check_script
(
script_name
,
"<run_path>"
,
script_name
,
self
.
_check_script
(
script_name
,
"<run_path>"
,
script_name
,
script_name
,
None
)
script_name
)
def
test_script_compiled
(
self
):
def
test_script_compiled
(
self
):
with
temp_dir
()
as
script_dir
:
with
temp_dir
()
as
script_dir
:
...
@@ -351,14 +463,14 @@ argv0 = sys.argv[0]
...
@@ -351,14 +463,14 @@ argv0 = sys.argv[0]
compiled_name
=
py_compile
.
compile
(
script_name
,
doraise
=
True
)
compiled_name
=
py_compile
.
compile
(
script_name
,
doraise
=
True
)
os
.
remove
(
script_name
)
os
.
remove
(
script_name
)
self
.
_check_script
(
compiled_name
,
"<run_path>"
,
compiled_name
,
self
.
_check_script
(
compiled_name
,
"<run_path>"
,
compiled_name
,
compiled_name
,
None
)
compiled_name
)
def
test_directory
(
self
):
def
test_directory
(
self
):
with
temp_dir
()
as
script_dir
:
with
temp_dir
()
as
script_dir
:
mod_name
=
'__main__'
mod_name
=
'__main__'
script_name
=
self
.
_make_test_script
(
script_dir
,
mod_name
)
script_name
=
self
.
_make_test_script
(
script_dir
,
mod_name
)
self
.
_check_script
(
script_dir
,
"<run_path>"
,
script_name
,
self
.
_check_script
(
script_dir
,
"<run_path>"
,
script_name
,
script_dir
,
''
)
script_dir
)
def
test_directory_compiled
(
self
):
def
test_directory_compiled
(
self
):
with
temp_dir
()
as
script_dir
:
with
temp_dir
()
as
script_dir
:
...
@@ -368,7 +480,7 @@ argv0 = sys.argv[0]
...
@@ -368,7 +480,7 @@ argv0 = sys.argv[0]
os
.
remove
(
script_name
)
os
.
remove
(
script_name
)
legacy_pyc
=
make_legacy_pyc
(
script_name
)
legacy_pyc
=
make_legacy_pyc
(
script_name
)
self
.
_check_script
(
script_dir
,
"<run_path>"
,
legacy_pyc
,
self
.
_check_script
(
script_dir
,
"<run_path>"
,
legacy_pyc
,
script_dir
,
''
)
script_dir
)
def
test_directory_error
(
self
):
def
test_directory_error
(
self
):
with
temp_dir
()
as
script_dir
:
with
temp_dir
()
as
script_dir
:
...
@@ -382,7 +494,7 @@ argv0 = sys.argv[0]
...
@@ -382,7 +494,7 @@ argv0 = sys.argv[0]
mod_name
=
'__main__'
mod_name
=
'__main__'
script_name
=
self
.
_make_test_script
(
script_dir
,
mod_name
)
script_name
=
self
.
_make_test_script
(
script_dir
,
mod_name
)
zip_name
,
fname
=
make_zip_script
(
script_dir
,
'test_zip'
,
script_name
)
zip_name
,
fname
=
make_zip_script
(
script_dir
,
'test_zip'
,
script_name
)
self
.
_check_script
(
zip_name
,
"<run_path>"
,
fname
,
zip_name
,
''
)
self
.
_check_script
(
zip_name
,
"<run_path>"
,
fname
,
zip_name
)
def
test_zipfile_compiled
(
self
):
def
test_zipfile_compiled
(
self
):
with
temp_dir
()
as
script_dir
:
with
temp_dir
()
as
script_dir
:
...
@@ -391,7 +503,7 @@ argv0 = sys.argv[0]
...
@@ -391,7 +503,7 @@ argv0 = sys.argv[0]
compiled_name
=
py_compile
.
compile
(
script_name
,
doraise
=
True
)
compiled_name
=
py_compile
.
compile
(
script_name
,
doraise
=
True
)
zip_name
,
fname
=
make_zip_script
(
script_dir
,
'test_zip'
,
zip_name
,
fname
=
make_zip_script
(
script_dir
,
'test_zip'
,
compiled_name
)
compiled_name
)
self
.
_check_script
(
zip_name
,
"<run_path>"
,
fname
,
zip_name
,
''
)
self
.
_check_script
(
zip_name
,
"<run_path>"
,
fname
,
zip_name
)
def
test_zipfile_error
(
self
):
def
test_zipfile_error
(
self
):
with
temp_dir
()
as
script_dir
:
with
temp_dir
()
as
script_dir
:
...
@@ -426,9 +538,9 @@ argv0 = sys.argv[0]
...
@@ -426,9 +538,9 @@ argv0 = sys.argv[0]
def
test_main
():
def
test_main
():
run_unittest
(
run_unittest
(
RunModuleCodeTest
,
ExecutionLayerTestCase
,
RunModuleTest
,
RunModuleTest
Case
,
RunPathTest
RunPathTest
Case
)
)
if
__name__
==
"__main__"
:
if
__name__
==
"__main__"
:
...
...
Misc/NEWS
Dosyayı görüntüle @
2f54b98c
...
@@ -35,6 +35,9 @@ Core and Builtins
...
@@ -35,6 +35,9 @@ Core and Builtins
Library
Library
-------
-------
-
Issue
#
15230
:
runpy
.
run_path
now
correctly
sets
__package__
as
described
in
the
documentation
-
Issue
#
15315
:
Support
VS
2010
in
distutils
cygwincompiler
.
-
Issue
#
15315
:
Support
VS
2010
in
distutils
cygwincompiler
.
-
Issue
#
15294
:
Fix
a
regression
in
pkgutil
.
extend_path
()
's handling of
-
Issue
#
15294
:
Fix
a
regression
in
pkgutil
.
extend_path
()
's handling of
...
@@ -133,6 +136,8 @@ Documentation
...
@@ -133,6 +136,8 @@ Documentation
Tests
Tests
-----
-----
-
Issue
#
15230
:
Adopted
a
more
systematic
approach
in
the
runpy
tests
-
Issue
#
15300
:
Ensure
the
temporary
test
working
directories
are
in
the
same
-
Issue
#
15300
:
Ensure
the
temporary
test
working
directories
are
in
the
same
parent
folder
when
running
tests
in
multiprocess
mode
from
a
Python
build
.
parent
folder
when
running
tests
in
multiprocess
mode
from
a
Python
build
.
Patch
by
Chris
Jerdonek
.
Patch
by
Chris
Jerdonek
.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment