在Python脚本中运行批处理命令

时间:2017-02-17 11:40:04

标签: python subprocess

我正在尝试在Python脚本中执行批处理命令,只显示PDF文件名。基本上,Python脚本位于文件夹C:\users\me\desktop\python中,该文件夹应在桌面上的其他文件夹(C:\users\me\desktop\some-folder)上执行命令,该文件夹中包含带有PDF的子文件夹。

以下是代码:

from subprocess import call
import os

for root, dirs, files in os.walk("../some-folder"):
    for pdf_file in files:
        if pdf_file.endswith(".pdf"):
            pdf_file_path = os.path.join(root, pdf_file)
            os.chdir(root)
            call('for %%f in (*.pdf) do @echo %%f')

我得到的结果是“找不到文件”。

1 个答案:

答案 0 :(得分:3)

首先,由于您正在激活内置DOS命令,因此您必须设置shell=True来运行此类命令。

其次,即使它不起作用,因为双重百分比是为脚本保留的。内联命令需要一个%

第三:不要使用os.chdir,这是不好的做法。更好地使用cwd调用subprocess选项,允许在运行命令时本地更改目录。

这样可行:

call('for %f in (*.pdf) do @echo %f',shell=True,cwd=root)

当然这可能是一个例子,因为你的命令没有完成任何事情:你没有在python脚本中得到输出,你没有检查返回码......

如果你想在根目录下的python中获取*.pdf的列表(带完整路径),我猜你知道

list_of_pdfs = glob.glob(os.path.join(root,"*.pdf"))

或相对:

list_of_pdfs = [x for x os.listdir(root) if fnmatch.fnmatch(x,"*.pdf")]

但是由于你处于os.walk循环中,你将获得与.pdf文件一样多的输出,因此它不是非常高效/糟糕的设计&复杂性。

对于你的整个转换循环,我会为每个文件调用转换器,不需要.bat脚本,你有python!:

from subprocess import call
import os

for root, dirs, files in os.walk("../some-folder"):
    for pdf_file in files:
        if pdf_file.endswith(".pdf"):
           call([r"C:\xpdf\bin32\pdftotext","-raw",pdf_file], cwd=root)

在列表中传递参数会自动处理文件名中的空格。