gpt4 book ai didi

python - 将从 os.walk 接收到的路径放入 cmd 中以在 Windows 终端上运行 - python

转载 作者:行者123 更新时间:2023-12-01 06:53:35 26 4
gpt4 key购买 nike

我的代码有问题,如下所示:

def optimizer(dst, directory = r"G:\Attachments\Attachments" ):
dst = " /d " + dst
reducer = '"' + r"C:\Program Files (x86)\ORPALIS\PDF Reducer 3 Professional Edition\pdfreducer.exe" + '"' + " /q 2"

for path, dirs, files in os.walk(directory):
src = r" /f " + path
cmd = reducer + src + dst
subprocess.call(cmd)

optimizer(r"C:\Users\Desktop\ReducedPdfs")

我想做的是遍历给定目录中的所有目录并使用以下命令优化 pdf:"C:\Program Files (x86)\ORPALIS\PDFReducer 3 Professional Edition\pdfreducer.exe"/q 2/f G:\Attachments\Attachments/d C:\Users\Desktop\ReducedPdfs .

问题出在我在上述方法中一起解析此命令时使用的 path 变量。如果我将其保留为从 os.walk 返回的值,则它是一个普通字符串,然后斜杠将被视为转义序列。如果我将它包装在 repr() 中,那么它会被放入带有前导和尾随单引号 (') 以及双反斜杠的 PDF Reducer 软件中,程序不知道如何处理。

我尝试使用 re.sub() 和 .replace() 将反斜杠替换为正斜杠,但无济于事。 re.sub() 似乎不能很好地处理转义字符,当我使用 .replace() 时,我的程序无法运行。使用 repr(),它会运行,但表示目标中不存在该文件。

最佳答案

subprocess 命令最好作为参数列表而不是长字符串,这有助于避免某些问题(例如转义序列、其中包含空格的路径、引号等)

您应该使用类似的内容(并进行修改以满足您的需求):

cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)

请注意,如果您这样使用它,则像 pathdstreducer 这样的路径甚至不需要用引号引起来如果它们中有空格,因为您已经指定它们是此列表中的单个项目。

这就是它在代码中的样子:

def optimizer(dst, directory = r"G:\Attachments\Attachments" ):
reducer = r"C:\Program Files (x86)\ORPALIS\PDF Reducer 3 Professional Edition\pdfreducer.exe"

for path, dirs, files in os.walk(directory):
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)

optimizer(r"C:\Users\Desktop\ReducedPdfs")

如果您只需要过滤掉包含 pdf 文件的子文件夹,请执行以下操作:

for path, dirs, files in os.walk(directory):
if any(f.endswith('.pdf') for f in files):
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)

或者,没有 os.walk 的上述版本的更快版本(使用 pathlib):

from pathlib import Path
paths = {str(f.parent) for f in Path(directory).rglob('*.pdf')}
for path in paths:
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)

关于python - 将从 os.walk 接收到的路径放入 cmd 中以在 Windows 终端上运行 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58900012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com