click.Path 有时解析为字节而不是 pathlib.Path

问题描述 投票:0回答:1

我有时会遇到这样的问题:使用

click
参数时,
Path
包无法返回
click.Path
,而是得到一个
bytes
对象。这是一个典型的代码示例,有时会导致问题:

from pathlib import Path
import click

@click.command()
@click.option('-i', '--input-directory',
              type=click.Path(file_okay=False, dir_okay=True, writable=False, path_type=Path),
              help='Directory that contains all input data files')
@click.option('-o', '--output-file', type=click.File(mode='w'),
              help='Path to output file')
def main(input_directory: Path, output_file: Path):
    # fix an error where the argument is read as bytes instead of Path
    if not isinstance(input_directory, Path):
        input_directory = Path(str(input_directory, 'UTF-8'))

我正在使用

click==7.0.2
。该问题似乎仅在 GCP 项目中的虚拟机上运行脚本时才会发生。虚拟机使用
python3.8
python3.10
,两者都具有相同版本的
click
。请注意,这只发生在
click.Path
中,即当我需要传递目录作为参数时。只要有可能,我都会使用
click.File
,它完全可以正常工作。

我应该采取什么不同的做法?

python python-click
1个回答
0
投票

根据发行说明,仅在 v8.0 中添加了对 pathlib.Path 的转换。您可以看到当前

stable
v7.0 中的代码(在 coerce_path_result 中)有很大不同。我建议不要指定
path_type
,这会将其保留为字符串,然后始终使用
main
将其转换为
input_directory = Path(input_directory)
中的第一件事。这就是我们在只有 Click v7 可用的情况下所做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.