Во-первых, поскольку вы активируете встроенные команды DOS, вам нужно установить shell=True
для запуска таких команд.
Во-вторых, даже если это не сработает, поскольку для скриптов зарезервированы двойные проценты. В командной строке требуется одна подошва %
.
И в-третьих: не используйте os.chdir
, это плохая практика. Лучше использовать параметр cwd
subprocess
, позволяет локально изменять каталог при запуске команды.
Это будет работать:
call('for %f in (*.pdf) do @echo %f',shell=True,cwd=root)
Конечно, это, вероятно, является примером, так как вашей команды не выполняет ничего: вы не получите выход обратно в питон скрипт, вы не проверить код возврата .. .
Если вы хотите, чтобы получить список *.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 сценариев, у вас есть питон !:
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)
передачу аргументов в списке автоматически обрабатывают пробела в именах файлов.
Если вы уже получаете имена PDF с помощью python, почему вы пытаетесь повторить их снова с помощью команды cmd.exe FOR? Я не вижу, как это проблема пакетного файла. В этом вопросе у вас действительно нет командного файла. – Squashman