【Python测试】unittest源码解析三----loader.py之_get_name_from_path(self, path)

本文介绍了一个用于处理文件路径的方法_get_name_from_path,该方法通过规范化路径、分离文件扩展名、计算相对路径,并最终将路径分隔符替换为句点来生成符合特定格式要求的名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    def _get_name_from_path(self, path):
        path = os.path.splitext(os.path.normpath(path))[0]

        _relpath = os.path.relpath(path, self._top_level_dir)
        assert not os.path.isabs(_relpath), "Path must be within the project"
        assert not _relpath.startswith('..'), "Path must be within the project"

        name = _relpath.replace(os.path.sep, '.')
        return name

 

这个方法一开始先对传入的路径进行正常的格式化,使用os.path.normpath,官方注释:

 

 

os.path.normpath(path)

Normalize a pathname by collapsing redundant separators and up-levelreferences so thatA//B, A/B/, A/./B andA/foo/../B allbecome A/B. This string manipulation may change the meaning of a paththat contains symbolic links. On Windows, it converts forward slashes tobackward slashes. To normalize case, usenormcase().

就是把路径中多余的'/',句点'.'去掉,确保路径格式的正确。

 

 

 

os.path.splitext(path)

Split the pathname path into a pair (root,ext) such that root+ ext ==path, andext is empty or begins with a period and contains at most oneperiod. Leading periods on the basename are ignored;splitext('.cshrc')returns('.cshrc', '').

splitext可以把文件的路径名和后缀文件格式名分成两部分返回,比如test.py,就会被分为('test', '.py')

 

 

 

os.path.relpath(path[,start])

Return a relative filepath to path either from the current directory orfrom an optionalstart directory. This is a path computation: thefilesystem is not accessed to confirm the existence or nature ofpath orstart.

relpath用来确定相对路径的path,返回一个filepath

 

 

 

str.replace(old,new[, count])

Return a copy of the string with all occurrences of substring old replaced bynew. If the optional argument count is given, only the firstcountoccurrences are replaced.

上面那个方法最后使用replace把路径分隔符'/',替换成句点'.'。

 

Traceback (most recent call last): File "/Users/ios/Downloads/linux_1/tools/server_manger_tool/build.py", line 63, in <module> setup( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/__init__.py", line 66, in setup return setuptools.setup(**attrs) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/__init__.py", line 103, in setup return distutils.core.setup(**attrs) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 184, in setup return run_commands(dist) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 200, in run_commands dist.run_commands() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands self.run_command(cmd) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/dist.py", line 968, in run_command super().run_command(command) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command cmd_obj.run() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build.py", line 132, in run self.run_command(cmd_name) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/cmd.py", line 316, in run_command self.distribution.run_command(command) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/dist.py", line 968, in run_command super().run_command(command) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command cmd_obj.run() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/command/build_exe.py", line 298, in run freezer: Freezer = Freezer( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/freezer.py", line 1128, in __init__ Freezer.__init__(self, *args, **kwargs) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/freezer.py", line 175, in __init__ self.finder: ModuleFinder = self._get_module_finder() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/freezer.py", line 422, in _get_module_finder finder.include_package(name) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 837, in include_package self._import_all_sub_modules(module, deferred_imports) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 230, in _import_all_sub_modules sub_module = self._internal_import_module( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 362, in _internal_import_module module = self._load_module( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 433, in _load_module self._load_module_code(module, loader, deferred_imports) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 472, in _load_module_code module.hook(self) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/qthooks.py", line 293, in load_qt_qtqml copy_qt_files(finder, name, "QmlImportsPath", "*") File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/qthooks.py", line 156, in copy_qt_files for source_path, target_path in _get_qt_files(name, variable, arg): File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/qthooks.py", line 132, in _get_qt_files source_path, target_path = get_qt_paths(name, variable) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/qthooks.py", line 124, in get_qt_paths source_path, target_path = libraryinfo_paths[variable] KeyError: 'QmlImportsPath'
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值