Files
RustPython/extra_tests/snippets/stdlib_sys.py
2025-03-14 11:38:35 +09:00

130 lines
3.7 KiB
Python

import sys
import os
import subprocess
from testutils import assert_raises
print('python executable:', sys.executable)
print(sys.argv)
assert sys.argv[0].endswith('.py')
assert sys.platform == "linux" or sys.platform == "darwin" or sys.platform == "win32" or sys.platform == "unknown"
if hasattr(sys, "_framework"):
assert type(sys._framework) is str
assert isinstance(sys.builtin_module_names, tuple)
assert 'sys' in sys.builtin_module_names
assert isinstance(sys.implementation.name, str)
assert isinstance(sys.implementation.cache_tag, str)
assert sys.getfilesystemencoding() == 'utf-8'
assert sys.getfilesystemencodeerrors().startswith('surrogate')
assert sys.byteorder == "little" or sys.byteorder == "big"
assert isinstance(sys.flags, tuple)
assert type(sys.flags).__name__ == "flags"
assert type(sys.flags.optimize) is int
assert sys.flags[3] == sys.flags.optimize
assert sys.maxunicode == 1114111
# Tracing:
events = []
def trc(frame, event, arg):
fn_name = frame.f_code.co_name
events.append((fn_name, event, arg))
print('trace event:', fn_name, event, arg)
def demo(x):
if x > 0:
demo(x - 1)
sys.settrace(trc)
demo(5)
sys.settrace(None)
assert ("demo", "call", None) in events
assert sys.exc_info() == (None, None, None)
try:
1/0
except ZeroDivisionError as exc:
exc_info = sys.exc_info()
assert exc_info[0] == type(exc) == ZeroDivisionError
assert exc_info[1] == exc
# Recursion:
def recursive_call(n):
if n > 0:
recursive_call(n - 1)
sys.setrecursionlimit(200)
assert sys.getrecursionlimit() == 200
with assert_raises(RecursionError):
recursive_call(300)
if sys.platform.startswith("win"):
winver = sys.getwindowsversion()
print(f'winver: {winver} {winver.platform_version}')
# the biggest value of wSuiteMask (https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexa#members).
all_masks = 0x00000004 | 0x00000400 | 0x00004000 | 0x00000080 | 0x00000002 | 0x00000040 | 0x00000200 | \
0x00000100 | 0x00000001 | 0x00000020 | 0x00002000 | 0x00000010 | 0x00008000 | 0x00020000
# We really can't test if the results are correct, so it just checks for meaningful value
assert winver.major > 6
assert winver.minor >= 0
assert winver.build > 0
assert winver.platform == 2
assert isinstance(winver.service_pack, str)
assert 0 <= winver.suite_mask <= all_masks
assert 1 <= winver.product_type <= 3
# XXX if platform_version is implemented correctly, this'll break on compatiblity mode or a build without manifest
# these fields can mismatch in CPython
assert winver.major == winver.platform_version[0]
assert winver.minor == winver.platform_version[1]
# assert winver.build == winver.platform_version[2]
# test int_max_str_digits getter and setter
assert sys.get_int_max_str_digits() == 4300
sys.set_int_max_str_digits(640)
assert sys.get_int_max_str_digits() == 640
sys.set_int_max_str_digits(0)
assert sys.get_int_max_str_digits() == 0
with assert_raises(ValueError):
sys.set_int_max_str_digits(1)
sys.set_int_max_str_digits(1000)
assert sys.get_int_max_str_digits() == 1000
# Test the PYTHONSAFEPATH environment variable
code = "import sys; print(sys.flags.safe_path)"
env = dict(os.environ)
env.pop('PYTHONSAFEPATH', None)
args = (sys.executable, '-P', '-c', code)
proc = subprocess.run(
args, stdout=subprocess.PIPE,
universal_newlines=True, env=env)
assert proc.stdout.rstrip() == 'True', proc
assert proc.returncode == 0, proc
env['PYTHONSAFEPATH'] = '1'
proc = subprocess.run(
args, stdout=subprocess.PIPE,
universal_newlines=True, env=env)
assert proc.stdout.rstrip() == 'True'
assert proc.returncode == 0, proc