我有一个问题,希望这里的任何人都看到过类似的事情。看起来像是遍历字符串列表的循环返回一个包含未知来源数据的元组。
我使用 Pycharm 作为我的 IDE。仅当代码在调试模式下执行时才会发生该错误。
我有以下代码。
from multiprocessing import Process, Manager, Pool, Queue, Lock
import fnmatch
def find(_pat_set:set, _path:str, _ignore_pat: set = None, _exclude_path_set: set = None):
if _exclude_path_set is None:
_exclude_path_set = set()
if _ignore_pat is None:
_ignore_pat = set()
manager = Manager()
files_dict = manager.dict()
for root, dirs, files in os.walk(_path):
_ex_dir_set = set()
_full_dir_list = []
for _dir in dirs:
_full_dir = os.path.join(root, _dir)
_full_dir_list.append(_full_dir)
for _ex_dir in _exclude_path_set:
_filtered = list(fnmatch.filter(_full_dir_list, _ex_dir))
for f in _filtered:
_ex_dir_set.add(os.path.basename(f))
dirs[:] = sorted(list(set(dirs) - _ex_dir_set))
_searched_files = []
for _pat in _pat_set:
_searched_files += list(fnmatch.filter(files, _pat))
_ignore_files = []
for _ig_pat in _ignore_pat:
_ignore_files += list(fnmatch.filter(files, _ig_pat))
_parse_files = set(_searched_files) - set(_ignore_files)
files_dict[root] = dict((f, {}) for f in _parse_files)
return files_dict
def main():
exclude_set = {'*\\.*',
'*\\syn\\*',
'*\\tmp',
'*\\temp',
'*\\__pycache__'}
_files = find(_pat_set={'*'}, _path='c:\\work\\git_project\\project', _ignore_pat={'*.rpt', '.*', '*.sdc'}, _exclude_path_set=exclude_set)
if __name__ == '__main__':
main()
print('done')
这是一个查找例程,用于定位文件和文件夹并构建共享字典,该字典稍后在线程之间共享以进行处理。
问题出在以下代码段:
for _dir in dirs:
_full_dir = os.path.join(root, _dir)
当我执行代码时,代码部分出现以下错误
File "C:\Python310\lib\ntpath.py", line 143, in join
genericpath._check_arg_types('join', path, *paths)
File "C:\Python310\lib\genericpath.py", line 152, in _check_arg_types
raise TypeError(f'{funcname}() argument must be str, bytes, or '
TypeError: join() argument must be str, bytes, or os.PathLike object, not 'tuple'
当我查看调试窗口时,我有以下数据
dirs = ['.git', '.settings', 'interface', 'scripts', 'tmp', 'tst_sw']
但是 for 值“_dir”包含这个
_dir = ('c:\\work\\git_project\\project\\.git', ['hooks', 'info', 'lfs', 'logs', 'modules',
'objects', 'refs'], ['COMMIT_EDITMSG', 'config', 'description', 'FETCH_HEAD',
'gitk.cache', 'HEAD', 'index', 'ORIG_HEAD', 'packed-refs', 'sourcetreeconfig.json'])
所有这些数据从哪里来?它应该只包含字符串
_dir '.git'
仅在debug模式下代码正常执行是没有问题的。
我希望有人已经看过这个,我不知道我是否可以提供更多信息。
问候
我发现了问题,但没有找到问题的答案或原因。
我在该行添加了一个条件断点:
_full_dir_list.append(_full_dir)
在上面的行中生成的字符串中有一个搜索条件
_full_dir = os.path.join(root, _dir)
断点条件如下。
'mod\\soc_2' in _full_dir
我不知道是什么或什么,但显然它对列表造成了一些干扰,但这很有趣。
删除断点就解决了问题。