晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/cloudlinux/venv/lib/python3.11/site-packages/setuptools/_distutils/tests/ |
| Current File : //opt/cloudlinux/venv/lib/python3.11/site-packages/setuptools/_distutils/tests/test_sysconfig.py |
"""Tests for distutils.sysconfig."""
import contextlib
import distutils
import os
import pathlib
import subprocess
import sys
from distutils import sysconfig
from distutils.ccompiler import new_compiler # noqa: F401
from distutils.unixccompiler import UnixCCompiler
import jaraco.envs
import path
import pytest
from jaraco.text import trim
from test.support import swap_item
def _gen_makefile(root, contents):
jaraco.path.build({'Makefile': trim(contents)}, root)
return root / 'Makefile'
@pytest.mark.usefixtures('save_env')
class TestSysconfig:
def test_get_config_h_filename(self):
config_h = sysconfig.get_config_h_filename()
assert os.path.isfile(config_h)
@pytest.mark.skipif("platform.system() == 'Windows'")
@pytest.mark.skipif("sys.implementation.name != 'cpython'")
def test_get_makefile_filename(self):
makefile = sysconfig.get_makefile_filename()
assert os.path.isfile(makefile)
def test_get_python_lib(self, tmp_path):
assert sysconfig.get_python_lib() != sysconfig.get_python_lib(prefix=tmp_path)
def test_get_config_vars(self):
cvars = sysconfig.get_config_vars()
assert isinstance(cvars, dict)
assert cvars
@pytest.mark.skipif('sysconfig.IS_PYPY')
@pytest.mark.skipif('sysconfig.python_build')
@pytest.mark.xfail('platform.system() == "Windows"')
def test_srcdir_simple(self):
# See #15364.
srcdir = pathlib.Path(sysconfig.get_config_var('srcdir'))
assert srcdir.absolute()
assert srcdir.is_dir()
makefile = pathlib.Path(sysconfig.get_makefile_filename())
assert makefile.parent.samefile(srcdir)
@pytest.mark.skipif('sysconfig.IS_PYPY')
@pytest.mark.skipif('not sysconfig.python_build')
def test_srcdir_python_build(self):
# See #15364.
srcdir = pathlib.Path(sysconfig.get_config_var('srcdir'))
# The python executable has not been installed so srcdir
# should be a full source checkout.
Python_h = srcdir.joinpath('Include', 'Python.h')
assert Python_h.is_file()
assert sysconfig._is_python_source_dir(srcdir)
assert sysconfig._is_python_source_dir(str(srcdir))
def test_srcdir_independent_of_cwd(self):
"""
srcdir should be independent of the current working directory
"""
# See #15364.
srcdir = sysconfig.get_config_var('srcdir')
with path.Path('..'):
srcdir2 = sysconfig.get_config_var('srcdir')
assert srcdir == srcdir2
def customize_compiler(self):
# make sure AR gets caught
class compiler:
compiler_type = 'unix'
executables = UnixCCompiler.executables
def __init__(self):
self.exes = {}
def set_executables(self, **kw):
for k, v in kw.items():
self.exes[k] = v
sysconfig_vars = {
'AR': 'sc_ar',
'CC': 'sc_cc',
'CXX': 'sc_cxx',
'ARFLAGS': '--sc-arflags',
'CFLAGS': '--sc-cflags',
'CCSHARED': '--sc-ccshared',
'LDSHARED': 'sc_ldshared',
'SHLIB_SUFFIX': 'sc_shutil_suffix',
}
comp = compiler()
with contextlib.ExitStack() as cm:
for key, value in sysconfig_vars.items():
cm.enter_context(swap_item(sysconfig._config_vars, key, value))
sysconfig.customize_compiler(comp)
return comp
@pytest.mark.skipif("not isinstance(new_compiler(), UnixCCompiler)")
@pytest.mark.usefixtures('disable_macos_customization')
def test_customize_compiler(self):
# Make sure that sysconfig._config_vars is initialized
sysconfig.get_config_vars()
os.environ['AR'] = 'env_ar'
os.environ['CC'] = 'env_cc'
os.environ['CPP'] = 'env_cpp'
os.environ['CXX'] = 'env_cxx --env-cxx-flags'
os.environ['LDSHARED'] = 'env_ldshared'
os.environ['LDFLAGS'] = '--env-ldflags'
os.environ['ARFLAGS'] = '--env-arflags'
os.environ['CFLAGS'] = '--env-cflags'
os.environ['CPPFLAGS'] = '--env-cppflags'
os.environ['RANLIB'] = 'env_ranlib'
comp = self.customize_compiler()
assert comp.exes['archiver'] == 'env_ar --env-arflags'
assert comp.exes['preprocessor'] == 'env_cpp --env-cppflags'
assert comp.exes['compiler'] == 'env_cc --env-cflags --env-cppflags'
assert comp.exes['compiler_so'] == (
'env_cc --env-cflags --env-cppflags --sc-ccshared'
)
assert (
comp.exes['compiler_cxx']
== 'env_cxx --env-cxx-flags --sc-cflags --env-cppflags'
)
assert comp.exes['linker_exe'] == 'env_cc'
assert comp.exes['linker_so'] == (
'env_ldshared --env-ldflags --env-cflags --env-cppflags'
)
assert comp.shared_lib_extension == 'sc_shutil_suffix'
if sys.platform == "darwin":
assert comp.exes['ranlib'] == 'env_ranlib'
else:
assert 'ranlib' not in comp.exes
del os.environ['AR']
del os.environ['CC']
del os.environ['CPP']
del os.environ['CXX']
del os.environ['LDSHARED']
del os.environ['LDFLAGS']
del os.environ['ARFLAGS']
del os.environ['CFLAGS']
del os.environ['CPPFLAGS']
del os.environ['RANLIB']
comp = self.customize_compiler()
assert comp.exes['archiver'] == 'sc_ar --sc-arflags'
assert comp.exes['preprocessor'] == 'sc_cc -E'
assert comp.exes['compiler'] == 'sc_cc --sc-cflags'
assert comp.exes['compiler_so'] == 'sc_cc --sc-cflags --sc-ccshared'
assert comp.exes['compiler_cxx'] == 'sc_cxx --sc-cflags'
assert comp.exes['linker_exe'] == 'sc_cc'
assert comp.exes['linker_so'] == 'sc_ldshared'
assert comp.shared_lib_extension == 'sc_shutil_suffix'
assert 'ranlib' not in comp.exes
def test_parse_makefile_base(self, tmp_path):
makefile = _gen_makefile(
tmp_path,
"""
CONFIG_ARGS= '--arg1=optarg1' 'ENV=LIB'
VAR=$OTHER
OTHER=foo
""",
)
d = sysconfig.parse_makefile(makefile)
assert d == {'CONFIG_ARGS': "'--arg1=optarg1' 'ENV=LIB'", 'OTHER': 'foo'}
def test_parse_makefile_literal_dollar(self, tmp_path):
makefile = _gen_makefile(
tmp_path,
"""
CONFIG_ARGS= '--arg1=optarg1' 'ENV=\\$$LIB'
VAR=$OTHER
OTHER=foo
""",
)
d = sysconfig.parse_makefile(makefile)
assert d == {'CONFIG_ARGS': r"'--arg1=optarg1' 'ENV=\$LIB'", 'OTHER': 'foo'}
def test_sysconfig_module(self):
import sysconfig as global_sysconfig
assert global_sysconfig.get_config_var('CFLAGS') == sysconfig.get_config_var(
'CFLAGS'
)
assert global_sysconfig.get_config_var('LDFLAGS') == sysconfig.get_config_var(
'LDFLAGS'
)
# On macOS, binary installers support extension module building on
# various levels of the operating system with differing Xcode
# configurations, requiring customization of some of the
# compiler configuration directives to suit the environment on
# the installed machine. Some of these customizations may require
# running external programs and are thus deferred until needed by
# the first extension module build. Only
# the Distutils version of sysconfig is used for extension module
# builds, which happens earlier in the Distutils tests. This may
# cause the following tests to fail since no tests have caused
# the global version of sysconfig to call the customization yet.
# The solution for now is to simply skip this test in this case.
# The longer-term solution is to only have one version of sysconfig.
@pytest.mark.skipif("sysconfig.get_config_var('CUSTOMIZED_OSX_COMPILER')")
def test_sysconfig_compiler_vars(self):
import sysconfig as global_sysconfig
if sysconfig.get_config_var('CUSTOMIZED_OSX_COMPILER'):
pytest.skip('compiler flags customized')
assert global_sysconfig.get_config_var('LDSHARED') == sysconfig.get_config_var(
'LDSHARED'
)
assert global_sysconfig.get_config_var('CC') == sysconfig.get_config_var('CC')
@pytest.mark.skipif("not sysconfig.get_config_var('EXT_SUFFIX')")
def test_SO_deprecation(self):
with pytest.warns(DeprecationWarning):
sysconfig.get_config_var('SO')
def test_customize_compiler_before_get_config_vars(self, tmp_path):
# Issue #21923: test that a Distribution compiler
# instance can be called without an explicit call to
# get_config_vars().
jaraco.path.build(
{
'file': trim("""
from distutils.core import Distribution
config = Distribution().get_command_obj('config')
# try_compile may pass or it may fail if no compiler
# is found but it should not raise an exception.
rc = config.try_compile('int x;')
""")
},
tmp_path,
)
p = subprocess.Popen(
[sys.executable, tmp_path / 'file'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
encoding='utf-8',
)
outs, errs = p.communicate()
assert 0 == p.returncode, "Subprocess failed: " + outs
def test_parse_config_h(self):
config_h = sysconfig.get_config_h_filename()
input = {}
with open(config_h, encoding="utf-8") as f:
result = sysconfig.parse_config_h(f, g=input)
assert input is result
with open(config_h, encoding="utf-8") as f:
result = sysconfig.parse_config_h(f)
assert isinstance(result, dict)
@pytest.mark.skipif("platform.system() != 'Windows'")
@pytest.mark.skipif("sys.implementation.name != 'cpython'")
def test_win_ext_suffix(self):
assert sysconfig.get_config_var("EXT_SUFFIX").endswith(".pyd")
assert sysconfig.get_config_var("EXT_SUFFIX") != ".pyd"
@pytest.mark.skipif("platform.system() != 'Windows'")
@pytest.mark.skipif("sys.implementation.name != 'cpython'")
@pytest.mark.skipif(
'\\PCbuild\\'.casefold() not in sys.executable.casefold(),
reason='Need sys.executable to be in a source tree',
)
def test_win_build_venv_from_source_tree(self, tmp_path):
"""Ensure distutils.sysconfig detects venvs from source tree builds."""
env = jaraco.envs.VEnv()
env.create_opts = env.clean_opts
env.root = tmp_path
env.ensure_env()
cmd = [
env.exe(),
"-c",
"import distutils.sysconfig; print(distutils.sysconfig.python_build)",
]
distutils_path = os.path.dirname(os.path.dirname(distutils.__file__))
out = subprocess.check_output(
cmd, env={**os.environ, "PYTHONPATH": distutils_path}
)
assert out == "True"
def test_get_python_inc_missing_config_dir(self, monkeypatch):
"""
In portable Python installations, the sysconfig will be broken,
pointing to the directories where the installation was built and
not where it currently is. In this case, ensure that the missing
directory isn't used for get_python_inc.
See pypa/distutils#178.
"""
def override(name):
if name == 'INCLUDEPY':
return '/does-not-exist'
return sysconfig.get_config_var(name)
monkeypatch.setattr(sysconfig, 'get_config_var', override)
assert os.path.exists(sysconfig.get_python_inc())
|