在软件开发和系统管理领域,文件路径处理是一项基础却至关重要的任务。无论是读取配置文件、处理用户上传的文件、组织日志文件,还是进行系统管理,我们都需要频繁地与文件路径打交道。然而,路径处理远不像表面看起来那么简单直接——不同操作系统的路径分隔符差异、绝对路径与相对路径的转换、路径组件的解析与重组、符号链接的处理等问题,都给开发者带来了诸多挑战。

Python作为一门跨平台的编程语言,提供了多种处理路径的工具和方法。从传统的os.path模块到面向对象的pathlib模块,Python的路径处理能力在不断演进和完善。掌握这些工具不仅能让代码更加简洁清晰,还能确保程序在不同操作系统上的兼容性和可靠性。

本文将深入探讨Python中路径处理的各个方面,从基础操作到高级技巧,从传统方法到现代最佳实践。我们将通过大量实际示例,展示如何高效、安全地处理各种路径相关任务,帮助读者构建健壮且可维护的应用程序。

一、路径处理基础:os.path模块

1.1 os.path模块概述

os.path是Python中最传统且广泛使用的路径处理模块。它提供了一系列函数来处理字符串形式的路径名,这些函数能够自动适应不同操作系统的约定。

1

2

3

4

5

6

7

8

9

10

11

12

13

import os

# 基本路径操作示例

path = "/home/user/documents/file.txt"

# 获取路径的各个组件

print("目录名:", os.path.dirname(path))

print("文件名:", os.path.basename(path))

print("扩展名:", os.path.splitext(path)[1])

# 路径拼接

new_path = os.path.join("/home/user", "documents", "new_file.txt")

print("拼接后的路径:", new_path)

1.2 常用os.path函数详解

1.2.1 路径组件提取

1

2

3

4

5

6

7

8

9

import os

path = "/home/user/docs/report.pdf"

# 提取不同组件

print("目录部分:", os.path.dirname(path))      # /home/user/docs

print("文件名部分:", os.path.basename(path))   # report.pdf

print("分割路径:", os.path.split(path))        # ('/home/user/docs', 'report.pdf')

print("分割扩展名:", os.path.splitext(path))   # ('/home/user/docs/report', '.pdf')

1.2.2 路径检测与验证

1

2

3

4

5

6

7

8

9

10

11

12

13

def analyze_path(path):

    """全面分析路径属性"""

    print(f"路径: {path}")

    print(f"是否存在: {os.path.exists(path)}")

    print(f"是文件: {os.path.isfile(path)}")

    print(f"是目录: {os.path.isdir(path)}")

    print(f"是绝对路径: {os.path.isabs(path)}")

    print(f"是链接: {os.path.islink(path)}")

    print(f"文件大小: {os.path.getsize(path) if os.path.exists(path) else 'N/A'} bytes")

    print(f"最后修改时间: {os.path.getmtime(path) if os.path.exists(path) else 'N/A'}")

     

# 使用示例

analyze_path("/etc/passwd")

1.2.3 路径规范化与绝对路径

1

2

3

4

5

6

7

8

9

10

11

12

13

# 路径规范化

print("规范化路径:", os.path.normpath("/home//user/../docs/./file.txt"))

# 获取绝对路径

relative_path = "../docs/file.txt"

abs_path = os.path.abspath(relative_path)

print("绝对路径:", abs_path)

# 获取相对路径

base_path = "/home/user"

target_path = "/home/user/docs/file.txt"

relative = os.path.relpath(target_path, base_path)

print("相对路径:", relative)

二、现代路径处理:pathlib模块

2.1 pathlib简介与优势

Python 3.4引入了pathlib模块,提供了面向对象的路径操作方式。与os.path相比,pathlib具有更直观的API、更好的可读性和更强大的功能。

1

2

3

4

5

6

7

8

9

10

11

from pathlib import Path

# 创建Path对象

p = Path('/home/user/docs/file.txt')

# 面向对象的操作方式

print("父目录:", p.parent)

print("文件名:", p.name)

print(" stem:", p.stem)        # 不带扩展名的文件名

print("后缀:", p.suffix)

print("所有父目录:", list(p.parents))

2.2 Path对象的基本操作

2.2.1 路径构建与解析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from pathlib import Path

# 多种创建Path对象的方式

home = Path.home()  # 用户家目录

cwd = Path.cwd()    # 当前工作目录

# 路径拼接

config_file = home / '.config' / 'app' / 'config.ini'

print("配置文件路径:", config_file)

# 路径组件访问

print("文件名:", config_file.name)

print("父目录:", config_file.parent)

print("后缀:", config_file.suffix)

print("所有后缀:", config_file.suffixes)  # 对于.tar.gz这样的多后缀文件

2.2.2 文件系统操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

from pathlib import Path

# 创建测试文件

test_dir = Path('test_directory')

test_file = test_dir / 'test.txt'

# 创建目录(包括父目录)

test_dir.mkdir(parents=True, exist_ok=True)

# 写入文件

test_file.write_text('Hello, Pathlib!')

# 读取文件

content = test_file.read_text()

print("文件内容:", content)

# 文件信息

print("文件大小:", test_file.stat().st_size)

print("是否是文件:", test_file.is_file())

print("是否是目录:", test_dir.is_dir())

# 清理

test_file.unlink()

test_dir.rmdir()

2.2.3 路径匹配与查找

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

from pathlib import Path

import re

# 遍历目录

def find_files(pattern, directory='.'):

    """查找匹配模式的文件"""

    path = Path(directory)

    return list(path.rglob(pattern))

# 使用示例

python_files = find_files('*.py')

print("Python文件:", python_files)

# 更复杂的匹配

def find_large_python_files(min_size=1024):

    """查找大于指定大小的Python文件"""

    path = Path('.')

    for file_path in path.rglob('*.py'):

        if file_path.stat().st_size > min_size:

            yield file_path

# 使用生成器

for large_file in find_large_python_files(2048):

    print(f"大文件: {large_file} ({large_file.stat().st_size} bytes)")

三、高级路径处理技巧

3.1 跨平台路径处理

处理不同操作系统的路径差异是路径处理中的重要挑战。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import os

from pathlib import Path

class CrossPlatformPath:

    """跨平台路径处理工具类"""

     

    @staticmethod

    def ensure_unix_path(path):

        """确保路径使用Unix风格分隔符"""

        if isinstance(path, Path):

            path = str(path)

        return path.replace('\\', '/')

     

    @staticmethod

    def ensure_native_path(path):

        """转换为本地操作系统风格的路径"""

        if isinstance(path, Path):

            return path

        return Path(path)

     

    @staticmethod

    def is_hidden(path):

        """检查路径是否为隐藏文件/目录(跨平台)"""

        path = Path(path)

        name = path.name

         

        # Unix/Linux: 以点开头

        if name.startswith('.'):

            return True

             

        # Windows: 检查隐藏属性

        if os.name == 'nt' and hasattr(path, 'stat'):

            try:

                import stat

                return bool(path.stat().st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN)

            except (OSError, AttributeError):

                pass

                 

        return False

# 使用示例

path = "C:\\Users\\Admin\\.config"

unix_style = CrossPlatformPath.ensure_unix_path(path)

print("Unix风格路径:", unix_style)

print("是隐藏路径:", CrossPlatformPath.is_hidden(path))

3.2 安全路径处理

防止路径遍历攻击和其他安全问题是Web应用和系统工具开发中的重要考虑。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

from pathlib import Path

import os

class SafePathHandler:

    """安全路径处理工具"""

     

    def __init__(self, base_directory):

        self.base_dir = Path(base_directory).resolve()

         

    def get_safe_path(self, user_path):

        """获取安全的绝对路径,防止目录遍历攻击"""

        try:

            # 解析用户输入的路径

            requested_path = (self.base_dir / user_path).resolve()

             

            # 检查是否在基目录内

            if not requested_path.is_relative_to(self.base_dir):

                raise SecurityError("路径遍历攻击检测")

                 

            return requested_path

        except (ValueError, RuntimeError):

            raise SecurityError("无效的路径")

             

    def read_file_safely(self, user_path):

        """安全地读取文件"""

        safe_path = self.get_safe_path(user_path)

         

        if not safe_path.is_file():

            raise FileNotFoundError("文件不存在")

             

        return safe_path.read_text()

     

    def ensure_directory(self, path):

        """确保目录存在且具有适当权限"""

        path = Path(path)

        path.mkdir(parents=True, exist_ok=True)

         

        # 设置安全权限(Unix系统)

        if hasattr(os, 'chmod'):

            os.chmod(path, 0o755)

             

        return path

class SecurityError(Exception):

    """安全相关异常"""

    pass

# 使用示例

handler = SafePathHandler('/var/www/uploads')

try:

    safe_path = handler.get_safe_path('user123/document.pdf')

    content = handler.read_file_safely('user123/document.pdf')

except SecurityError as e:

    print(f"安全错误: {e}")

3.3 路径模式匹配与过滤

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

from pathlib import Path

import fnmatch

import re

class PathMatcher:

    """高级路径匹配工具"""

     

    @staticmethod

    def match_patterns(path, patterns):

        """使用多种模式匹配路径"""

        path_str = str(path)

         

        for pattern in patterns:

            # 通配符匹配

            if fnmatch.fnmatch(path_str, pattern):

                return True

                 

            # 正则表达式匹配

            if pattern.startswith('regex:'):

                regex_pattern = pattern[6:]

                if re.search(regex_pattern, path_str):

                    return True

                     

        return False

     

    @staticmethod

    def find_matching_files(directory, include_patterns=None, exclude_patterns=None):

        """查找匹配特定模式的文件"""

        directory = Path(directory)

        include_patterns = include_patterns or ['*']

        exclude_patterns = exclude_patterns or []

         

        for file_path in directory.rglob('*'):

            if file_path.is_file():

                # 检查排除模式

                if exclude_patterns and PathMatcher.match_patterns(file_path, exclude_patterns):

                    continue

                     

                # 检查包含模式

                if PathMatcher.match_patterns(file_path, include_patterns):

                    yield file_path

# 使用示例

matcher = PathMatcher()

# 查找所有Python文件,但排除测试文件和隐藏文件

python_files = matcher.find_matching_files(

    '.',

    include_patterns=['*.py'],

    exclude_patterns=['*test*', '*__pycache__*', 'regex:^\..*']

)

for file in python_files:

    print(f"找到Python文件: {file}")

四、实战应用案例

4.1 案例一:配置文件路径管理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

from pathlib import Path

import platform

import appdirs

class ConfigManager:

    """跨平台配置文件管理"""

     

    def __init__(self, app_name):

        self.app_name = app_name

        self.system = platform.system()

         

    def get_config_path(self):

        """获取配置文件路径"""

        if self.system == "Windows":

            base_dir = Path(os.environ.get('APPDATA', Path.home()))

            return base_dir / self.app_name / 'config.ini'

        else:

            # Unix-like系统

            config_dir = Path.home() / '.config' / self.app_name

            config_dir.mkdir(parents=True, exist_ok=True)

            return config_dir / 'config.ini'

     

    def get_cache_path(self):

        """获取缓存目录"""

        if hasattr(appdirs, 'user_cache_dir'):

            cache_dir = Path(appdirs.user_cache_dir(self.app_name))

        else:

            if self.system == "Windows":

                cache_dir = Path(os.environ.get('LOCALAPPDATA', Path.home())) / 'Cache' / self.app_name

            else:

                cache_dir = Path.home() / '.cache' / self.app_name

                 

        cache_dir.mkdir(parents=True, exist_ok=True)

        return cache_dir

     

    def get_log_path(self):

        """获取日志文件路径"""

        if self.system == "Windows":

            log_dir = Path(os.environ.get('LOCALAPPDATA', Path.home())) / 'Logs' / self.app_name

        else:

            log_dir = Path('/var/log') / self.app_name

            # 如果没有权限访问/var/log,则使用用户目录

            if not log_dir.exists() and not os.access(log_dir.parent, os.W_OK):

                log_dir = Path.home() / '.local' / 'log' / self.app_name

                 

        log_dir.mkdir(parents=True, exist_ok=True)

        return log_dir / f"{self.app_name}.log"

# 使用示例

config_mgr = ConfigManager('my_app')

print("配置文件:", config_mgr.get_config_path())

print("缓存目录:", config_mgr.get_cache_path())

print("日志文件:", config_mgr.get_log_path())

4.2 案例二:自动化文件整理脚本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

from pathlib import Path

import shutil

from datetime import datetime

class FileOrganizer:

    """自动文件整理工具"""

     

    def __init__(self, source_dir, target_base_dir):

        self.source_dir = Path(source_dir)

        self.target_base_dir = Path(target_base_dir)

         

    def organize_by_extension(self):

        """按文件扩展名整理文件"""

        for file_path in self.source_dir.iterdir():

            if file_path.is_file():

                # 获取文件扩展名(不带点)

                extension = file_path.suffix[1:].lower() if file_path.suffix else 'no_extension'

                 

                # 创建目标目录

                target_dir = self.target_base_dir / extension

                target_dir.mkdir(parents=True, exist_ok=True)

                 

                # 移动文件

                target_file = target_dir / file_path.name

                shutil.move(str(file_path), str(target_file))

                print(f"移动: {file_path} -> {target_file}")

     

    def organize_by_date(self, date_format="%Y-%m"):

        """按日期整理文件"""

        for file_path in self.source_dir.rglob('*'):

            if file_path.is_file():

                # 获取文件修改时间

                mtime = datetime.fromtimestamp(file_path.stat().st_mtime)

                 

                # 创建日期目录

                date_str = mtime.strftime(date_format)

                target_dir = self.target_base_dir / date_str

                target_dir.mkdir(parents=True, exist_ok=True)

                 

                # 移动文件

                target_file = target_dir / file_path.name

                shutil.move(str(file_path), str(target_file))

                print(f"移动: {file_path} -> {target_file}")

     

    def find_duplicates(self):

        """查找重复文件(基于文件名和大小)"""

        seen_files = {}

        duplicates = []

         

        for file_path in self.source_dir.rglob('*'):

            if file_path.is_file():

                file_key = (file_path.name, file_path.stat().st_size)

                 

                if file_key in seen_files:

                    duplicates.append((seen_files[file_key], file_path))

                else:

                    seen_files[file_key] = file_path

                     

        return duplicates

# 使用示例

organizer = FileOrganizer('/path/to/source', '/path/to/organized')

organizer.organize_by_extension()

duplicates = organizer.find_duplicates()

for original, duplicate in duplicates:

    print(f"重复文件: {duplicate} (原始: {original})")

4.3 案例三:Web应用文件上传处理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

from pathlib import Path

import uuid

import hashlib

from datetime import datetime

class UploadFileHandler:

    """Web应用文件上传处理"""

     

    def __init__(self, upload_base_dir, allowed_extensions=None, max_file_size=10 * 1024 * 1024):

        self.upload_base_dir = Path(upload_base_dir)

        self.allowed_extensions = allowed_extensions or {'jpg', 'jpeg', 'png', 'gif', 'pdf'}

        self.max_file_size = max_file_size

         

    def generate_unique_filename(self, original_filename):

        """生成唯一文件名"""

        extension = Path(original_filename).suffix.lower()

        unique_id = uuid.uuid4().hex

        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

        return f"{timestamp}_{unique_id}{extension}"

     

    def is_file_allowed(self, filename):

        """检查文件类型是否允许"""

        extension = Path(filename).suffix.lower()[1:]  # 去掉点号

        return extension in self.allowed_extensions

     

    def save_uploaded_file(self, file_stream, original_filename):

        """安全保存上传的文件"""

        # 验证文件类型

        if not self.is_file_allowed(original_filename):

            raise ValueError("不允许的文件类型")

         

        # 生成安全文件名

        safe_filename = self.generate_unique_filename(original_filename)

         

        # 创建日期目录结构

        today = datetime.now()

        year_month_dir = self.upload_base_dir / today.strftime("%Y/%m")

        year_month_dir.mkdir(parents=True, exist_ok=True)

         

        # 完整文件路径

        file_path = year_month_dir / safe_filename

         

        # 保存文件

        with open(file_path, 'wb') as f:

            # 在实际应用中,这里应该有限流和大小检查

            f.write(file_stream.read())

         

        # 计算文件哈希(用于后续验证)

        file_hash = self.calculate_file_hash(file_path)

         

        return {

            'original_name': original_filename,

            'saved_path': file_path,

            'file_size': file_path.stat().st_size,

            'file_hash': file_hash,

            'upload_time': datetime.now()

        }

     

    def calculate_file_hash(self, file_path, algorithm='sha256'):

        """计算文件哈希值"""

        hash_func = hashlib.new(algorithm)

        with open(file_path, 'rb') as f:

            for chunk in iter(lambda: f.read(4096), b''):

                hash_func.update(chunk)

        return hash_func.hexdigest()

     

    def get_file_url(self, saved_file_info):

        """生成文件访问URL"""

        # 将物理路径转换为Web可访问的URL路径

        relative_path = saved_file_info['saved_path'].relative_to(self.upload_base_dir)

        return f"/uploads/{relative_path}"

# 使用示例

upload_handler = UploadFileHandler('/var/www/uploads')

# 模拟文件上传

class MockFile:

    def __init__(self, content, filename):

        self.content = content

        self.filename = filename

     

    def read(self):

        return self.content

mock_file = MockFile(b'test content', 'test.txt')

file_info = upload_handler.save_uploaded_file(mock_file, 'test.txt')

print("文件保存信息:", file_info)

print("文件访问URL:", upload_handler.get_file_url(file_info))

五、最佳实践与性能优化

5.1 路径处理最佳实践

  • ​使用pathlib代替os.path​​:Python 3.6+推荐使用pathlib,它提供更直观的API
  • ​正确处理路径分隔符​​:总是使用/运算符或os.path.join()进行路径拼接
  • ​验证路径安全性​​:特别是处理用户输入的路径时
  • ​使用resolve()获取绝对路径​​:避免相对路径导致的混淆
  • ​适当使用raw字符串​​:处理Windows路径时,使用r"path"避免转义问题

5.2 性能优化技巧

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

from pathlib import Path

import os

def efficient_path_operations():

    """高效的路径操作示例"""

     

    # 1. 批量操作时缓存Path对象

    base_dir = Path('/path/to/base')

    files = list(base_dir.rglob('*.txt'))  # 预先获取文件列表

     

    # 2. 使用生成器处理大量文件

    def process_files_generator(directory):

        for file_path in Path(directory).rglob('*'):

            if file_path.is_file():

                yield file_path

     

    # 3. 减少stat调用(昂贵的系统调用)

    file_paths = [p for p in Path('.').rglob('*') if p.is_file()]

     

    # 4. 使用os.scandir()进行高性能目录遍历(Python 3.5+)

    def fast_directory_walk(directory):

        with os.scandir(directory) as entries:

            for entry in entries:

                if entry.is_file():

                    yield entry.path

                elif entry.is_dir():

                    yield from fast_directory_walk(entry.path)

     

    return files

# 使用示例

files = efficient_path_operations()

print(f"找到 {len(files)} 个文件")

5.3 错误处理与日志记录

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

from pathlib import Path

import logging

import sys

# 配置日志

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class RobustPathHandler:

    """健壮的路径处理工具"""

     

    def __init__(self):

        self.logger = logging.getLogger(__name__)

     

    def safe_file_operation(self, operation_func, *args, **kwargs):

        """执行安全的文件操作"""

        try:

            result = operation_func(*args, **kwargs)

            self.logger.info(f"操作成功: {operation_func.__name__}")

            return result

        except FileNotFoundError as e:

            self.logger.error(f"文件未找到: {e}")

            raise

        except PermissionError as e:

            self.logger.error(f"权限错误: {e}")

            raise

        except OSError as e:

            self.logger.error(f"系统错误: {e}")

            raise

        except Exception as e:

            self.logger.error(f"未知错误: {e}")

            raise

     

    def create_directory_structure(self, base_path, structure_dict):

        """创建复杂的目录结构"""

        base_path = Path(base_path)

         

        for name, content in structure_dict.items():

            current_path = base_path / name

             

            if isinstance(content, dict):

                # 如果是目录

                current_path.mkdir(parents=True, exist_ok=True)

                self.create_directory_structure(current_path, content)

            else:

                # 如果是文件

                self.safe_file_operation(

                    current_path.write_text,

                    content if isinstance(content, str) else str(content)

                )

# 使用示例

handler = RobustPathHandler()

# 定义目录结构

project_structure = {

    'src': {

        'main.py': 'print("Hello World")',

        'utils': {

            'helpers.py': '# Utility functions'

        }

    },

    'tests': {

        'test_main.py': '# Test cases'

    },

    'docs': {}

}

# 创建项目结构

handler.create_directory_structure('/tmp/my_project', project_structure)

总结

路径处理是Python编程中的基础但至关重要的技能。通过本文的探讨,我们可以看到Python提供了从传统的os.path模块到现代的pathlib模块的完整路径处理解决方案。每种工具都有其适用场景和优势,开发者应该根据具体需求选择合适的方法。

​关键要点总结:​

  • ​选择合适的工具​​:对于新项目,优先使用pathlib;对于需要与旧代码兼容的情况,可以使用os.path
  • ​注重跨平台兼容性​​:始终考虑不同操作系统的路径差异,使用平台无关的路径操作方法
  • ​安全第一​​:特别是处理用户输入的路径时,必须进行安全验证和规范化
  • ​性能考虑​​:对于需要处理大量文件的场景,使用高效的遍历方法和适当的缓存策略
  • ​错误处理​​:健壮的程序应该能够妥善处理各种路径相关的异常情况

​现代路径处理的最佳实践:​

  • 使用Path对象代替字符串路径
  • 使用/运算符进行路径拼接
  • 使用resolve()获取绝对路径
  • 利用pathlib的链式方法调用
  • 实施适当的安全检查措施

通过掌握这些路径处理技术和最佳实践,开发者可以编写出更加健壮、可维护且跨平台兼容的Python应用程序。无论是简单的脚本还是复杂的Web应用,良好的路径处理都是确保程序正确运行

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐