我有时会遇到这样的问题:使用
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
,它完全可以正常工作。
我应该采取什么不同的做法?
根据发行说明,仅在 v8.0 中添加了对 pathlib.Path 的转换。您可以看到当前
stable和 v7.0 中的代码(在
coerce_path_result
中)有很大不同。我建议不要指定 path_type
,这会将其保留为字符串,然后始终使用 main
将其转换为 input_directory = Path(input_directory)
中的第一件事。这就是我们在只有 Click v7 可用的情况下所做的事情。