Frage zu Linux Shell aus Pythonscript (OCRmyPDF Batchfile)

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
clemensb
User
Beiträge: 2
Registriert: Donnerstag 17. Oktober 2019, 08:49

Hallo zusammen,

leider kenne ich mich mit Python so gut wie gar nicht aus,
habe ein Script gefunden, welches auf Github liegt und mir sehr gut hilft.
Habe es etwas angepasst durch probieren und googeln aber jetzt kommt ich einfach nicht weiter.
Hier ist das Script und ich markiere innerhalb des Scriptes mal die Zeile um die es geht.

Code: Alles auswählen

#!/usr/bin/env python3
# Walk through directory tree, replacing all files with OCR'd version
# Contributed by DeliciousPickle@github

import logging
import os
import subprocess
import sys

script_dir = os.path.dirname(os.path.realpath(__file__))
print(script_dir + '/ocr-tree.py: Start')

if len(sys.argv) > 1:
    start_dir = sys.argv[1]
else:
    start_dir = '/home/xxxx/pdfmigration/Incomming'

if len(sys.argv) > 2:
    log_file = sys.argv[2]
else:
    log_file = script_dir + '/ocr-tree.log'

logging.basicConfig(
        level=logging.INFO, format='%(asctime)s %(message)s',
        filename=log_file, filemode='w')

for dir_name, subdirs, file_list in os.walk(start_dir):
    logging.info('\n')
    logging.info(dir_name + '\n')
    os.chdir(dir_name)
    for filename in file_list:
        file_ext = os.path.splitext(filename)[1]
        if file_ext == '.pdf':
            full_path = dir_name + '/' + filename
            print(full_path)
            --------->   cmd = ["ocrmypdf",  "--deskew", filename, "/home/xxxx/pdfmigration/Done/" + filename]   <---------
	    cmd = ["rm", "/home/clemens/pdfmigration/Incomming/" + filename]
            logging.info(cmd)
            proc = subprocess.run(
                cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
            result = proc.stdout
            if proc.returncode == 6:
                print("Skipped document because it already contained text")
            elif proc.returncode == 0:
                print("OCR complete")
            logging.info(result)
Die hier:
cmd = ["ocrmypdf", "--deskew", filename, "/home/xxxx/pdfmigration/Done/" + filename]

Das Script funktioniert und tut was es soll, wenn ich aber nun die Option:
cmd = ["ocrmypdf", "--deskew", "-l deu+eng", filename, "/home/xxxx/pdfmigration/Done/" + filename]
in der Zeile ergänze, geht es nicht mehr und ich bekomme diese Fehlermeldung:
'The installed version of tesseract does not have language data for the following requested languages:\n deu\n'

Jetzt frage ich mich, wo denn diese \n \n Teile herkommen, obwohl ich sie nirgends eintrage und ob die was damit zu tun haben.

Probiere ich es direkt, ohne über den Umweg des Scriptes, also so in etwa im Terminal:
ocrmypdf --deskew -l deu+eng "/home/xxx/pdfmigration/Incomming/test.pdf" "/home/xxx/pdfmigration/Done/test2.pdf"
funktioniert es auch prima.

Bitte verweißt mich jetzt nicht auf Manual lesen oder dergleichen, ich habe alles probiert, was ich bei google finden konnte.
DeliciousPickle@github kann ich leider nicht anschreiben und der, der das Script bei sich mit hostet will mir wohl nicht helfen.
Ich glaube es liegt an der Übergabe von Python nach Terminal (Bash) aber da fehlt mir einfach das Hintergrundwissen.

Hat jemand von euch die zündende Idee?
Viele Grüße
Clemens
Zuletzt geändert von clemensb am Donnerstag 17. Oktober 2019, 09:37, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die \n sind Zeilenendezeichen. Die sind nicht das Problem. Sondern das du dein Argument in EINEN String schreibst. Das müssen zwei sein, Option und wert. “-l”, “deu+eng”. Nicht wie du in einem.
clemensb
User
Beiträge: 2
Registriert: Donnerstag 17. Oktober 2019, 08:49

OMG, seit Gestern Nachmittag habe ich gefühlte 100 verschiedene Versionen der Schreibweise probiert.
Müsste ich zum Verhör, hätte ich beschwören können, das ich es auch so probiert habe...
Aber in der Tat, kaum macht man es richtig, schon funktioniert´s:
cmd = ["ocrmypdf", "--deskew", "-l", "deu+eng", filename, "/home/xxxx/pdfmigration/Done/" + filename]

Tausend Dank für die schnelle Hilfe, ich war echt am Verzweifeln.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@clemensb: das ist immer das Problem, wenn man irgendwo etwas findet, man weiß nicht, ob es jemand absichtlich weggeworfen hat, weil es kaputt ist.

Pfade setzt man nicht mit + sondern mit os.path.join zusammen, oder besser, man benutzt gleich pathlib.
os.chrdir hat in einem Programm nichts verloren, weil es einen globalen Zustand ändert und damit alle relativen Pfadangaben kaputt sind.

Code: Alles auswählen

#!/usr/bin/env python3
# Walk through directory tree, replacing all files with OCR'd version
import logging
import subprocess
from pathlib import Path
import sys

DONE_PATH = Path("/home/xxxx/pdfmigration/Done")
START_PATH= Path("'/home/xxxx/pdfmigration/Incomming'")

if len(sys.argv) > 1:
    start_path = Path(sys.argv[1])
else:
    start_path = START_PATH

if len(sys.argv) > 2:
    log_file = sys.argv[2]
else:
    log_file = 'ocr-tree.log'

logging.basicConfig(
    level=logging.INFO, format='%(asctime)s %(message)s',
    filename=log_file, filemode='w')

for filename in start_path.rglob('*.pdf'):
    cmd = ["ocrmypdf", "--deskew", "-l", "deu+eng", str(filename), str(DONE_PATH / filename.name)]
    logging.info(cmd)
    run = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    result = run.stdout
    if run.returncode == 0:
        print("OCR complete")
    elif run.returncode == 6:
        print("Skipped document because it already contained text")
    else:
        print(f"Unkown Error {run.returncode}")
    logging.info(result)
sebastian99
User
Beiträge: 1
Registriert: Donnerstag 7. November 2019, 18:27

Sirius3 hat geschrieben: Donnerstag 17. Oktober 2019, 09:59 @clemensb: das ist immer das Problem, wenn man irgendwo etwas findet, man weiß nicht, ob es jemand absichtlich weggeworfen hat, weil es kaputt ist.

Pfade setzt man nicht mit + sondern mit os.path.join zusammen, oder besser, man benutzt gleich pathlib.
os.chrdir hat in einem Programm nichts verloren, weil es einen globalen Zustand ändert und damit alle relativen Pfadangaben kaputt sind.

Code: Alles auswählen

#!/usr/bin/env python3
# Walk through directory tree, replacing all files with OCR'd version
import logging
import subprocess
from pathlib import Path
import sys

DONE_PATH = Path("/home/xxxx/pdfmigration/Done")
START_PATH= Path("'/home/xxxx/pdfmigration/Incomming'")

if len(sys.argv) > 1:
    start_path = Path(sys.argv[1])
else:
    start_path = START_PATH

if len(sys.argv) > 2:
    log_file = sys.argv[2]
else:
    log_file = 'ocr-tree.log'

logging.basicConfig(
    level=logging.INFO, format='%(asctime)s %(message)s',
    filename=log_file, filemode='w')

for filename in start_path.rglob('*.pdf'):
    cmd = ["ocrmypdf", "--deskew", "-l", "deu+eng", str(filename), str(DONE_PATH / filename.name)]
    logging.info(cmd)
    run = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    result = run.stdout
    if run.returncode == 0:
        print("OCR complete")
    elif run.returncode == 6:
        print("Skipped document because it already contained text")
    else:
        print(f"Unkown Error {run.returncode}")
    logging.info(result)
Ich bekomme mit deinem Code folgenden Fehler angezeigt:

Code: Alles auswählen

Traceback (most recent call last):
  File "ocrmypdf_python_script.py", line 30, in <module>
    run = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
AttributeError: 'module' object has no attribute 'run'
Weiß jemand wo das Problem liegt?
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein Python ist zu alt.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: das kann eigentlich nicht sein, denn dann funktionieren f-Strings auch nicht; und das gibt einen SyntaxError.

@sebastian99: Hast Du irgendwo eine Datei namens subprocess.py herumliegen?
Antworten