如何使用 Path 对象 + 字符串构建 os.system() 命令?

How do I build an os.system() command using a Path object + string?

我正在尝试编写一个脚本,从配置文件中提取一些路径并调用系统 shell 到 运行 一个使用路径作为命令一部分的命令。它基本上是一个解压缩目录中所有文件的摘要脚本。请记住,我正在自学 Python,这是我的第一个 python 脚本,这是我的第一个 post。请原谅我在礼节方面的错误。

目标是在目录上获取命令 'C:\Program Files\WinRAR\Rar.exe x' 到 运行。不幸的是,我了解到 Python 不允许您将字符串连接到 Path 对象,大概是因为它们是两种不同的元素类型。我有以下内容:

在配置文件中:

[Paths]
WinrarInstallPath = C:\Program Files\WinRAR\
NewFilesDirectory = M:\Directory\Where\Rar Files\Are\Located

脚本:

**SOME CODE***
new_files_dir = Path(config.get('Paths', 'NewFilesDirectory'))
winrar_dir = Path(config.get('Paths', 'WinrarInstallPath'))

**SOME MORE CODE**
os.chdir(new_files_dir)
for currentdir, dirnames, filenames in os.walk('.'):
    os.system(winrar_dir + "rar.exe x " + os.getcwd() + currentdir[1:] + '\*.rar')

这给了我错误 "TypeError: unsupported operand type(s) for +: 'WindowsPath' and 'str'"

我试过了

os.system(str(winrar_dir) + "rar.exe x " + os.getcwd() + currentdir[1:] + '\*.rar')

但它不处理目录名称中的空格。我也试过

os.system(os.path.join(winrar_dir, "rar.exe x ") + os.getcwd() + currentdir[1:] + '\*.rar')

结果相同

我意识到我可以从一开始就将其视为字符串并执行以下操作

wrd = config.get('Paths', 'WinrarInstallationPath')
winrar_dir = '"' + wrd + '"'

os.system(winrar_dir + "rar.exe x " + os.getcwd() + currentdir[1:] + '\*.rar')

但是 Python 到目前为止已经很圆滑了,这感觉很笨拙,所以我觉得我遗漏了什么,但到目前为止我还没有找到答案。

如果您要尝试添加到 pathlib.Path 对象,您需要添加其 joinpath 方法来添加到路径,而不仅仅是 + 运算符将与字符串一起使用(这就是给你 TypeError 的原因)。

# From the docs:
Path('c:').joinpath('/Program Files')
Out[]: PureWindowsPath('c:/Program Files')

如果您仍然无法使用 Path.exists() 方法或 Path.glob 方法测试您正在阅读的路径是否指向正确的位置。

不要使用 os.system。使用 subprocess.call:

os.system(winrar_dir + "rar.exe x " + os.getcwd() + currentdir[1:] + '\*.rar')

列表就是argv数组的字面意思。 shell.

无需报价
subprocess.call([os.path.join(winrar_dir, 'rar.exe'), 'x', os.getcwd(), os.path.join(currentdir[1:], '*.rar')])

您可能还看到我不喜欢 pathlib 模块。我用了它的前身路径,只发现它的walkfiles方法有用。