如何使用 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方法有用。
我正在尝试编写一个脚本,从配置文件中提取一些路径并调用系统 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方法有用。