2017-02-17 3 views
0

Я пытаюсь выполнить пакетную команду в скрипте Python, просто отображая имя файла PDF. В принципе, скрипт Python находится в папке C:\users\me\desktop\python, которая должна выполнять команду в другой папке на рабочем столе (C:\users\me\desktop\some-folder), в которой есть подпапки с PDF-файлами.Выполнение команд партии в скрипте 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"): 
      pdf_file_path = os.path.join(root, pdf_file) 
      os.chdir(root) 
      call('for %%f in (*.pdf) do @echo %%f') 

В результате я получаю это "файл не найден".

+0

Если вы уже получаете имена PDF с помощью python, почему вы пытаетесь повторить их снова с помощью команды cmd.exe FOR? Я не вижу, как это проблема пакетного файла. В этом вопросе у вас действительно нет командного файла. – Squashman

ответ

3

Во-первых, поскольку вы активируете встроенные команды DOS, вам нужно установить shell=True для запуска таких команд.

Во-вторых, даже если это не сработает, поскольку для скриптов зарезервированы двойные проценты. В командной строке требуется одна подошва %.

И в-третьих: не используйте os.chdir, это плохая практика. Лучше использовать параметр cwdsubprocess, позволяет локально изменять каталог при запуске команды.

Это будет работать:

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) 

передачу аргументов в списке автоматически обрабатывают пробела в именах файлов.

+0

Спасибо, это сработало! Однако, когда я просто печатаю имена файлов PDF, как в примере, все файлы PDF появляются несколько раз, хотя они только в списке один раз? – vdvaxel

+0

Я вижу, что вы отредактировали свой ответ: я действительно получаю вывод столько раз, сколько есть .pdf-файлов. Как мне изменить код, чтобы предотвратить это? – vdvaxel

+0

Вы хотите просто распечатать файлы или сделать что-то еще? –

Смежные вопросы